Objective-C
Swift

Swift:SwiftからObjectiveCのコードが参照できないときのチェックポイントメモ

More than 3 years have passed since last update.

はじめに

Swiftでプログラムを書いていてもやはりObjectiveCのコードを参照する必要があるときはまだまだあります。
上手く行っているときは良いんですが、トラブルとなかなかどうしていいかわからないこともあると思います。

そういう時のチェックポイントのメモです。

※「本体側のプロジェクトを アプリプロジェクト」「テストプロジェクトを テストプロジェクト」と呼ぶことにします。

[project]-Bridging-Header.h はあるか?

SwiftのコードからObjectiveCのコードを参照するには、 [project]-Bridginge-Header.h を用意してそこに HeaderFileのImportを書く必要があります。
SwiftとObjective-Cの相互利用する際の注意
などが参考になると思います。

HeaderはあるのにアプリプロジェクトでBridging-Headerが見つけられない時

Bridging-Headerはあるのに、アプリプロジェクトで見つけられない、という場合は、
アプリプロジェクトの以下の部分がちゃんと埋まっているか確認してみてください。
たまにXcodeが自動生成してくれてなくて空っぽの時があります。

DeepTransitionSample_xcodeproj.png

Bridging-Header内のimportファイルがテストプロジェクトからfile not foundになる

アプリ側のビルドは通っているにも関わらずテストプロジェクトのビルドに失敗する 時があります。
以下のように File Not Found と言われます。

DeepTransitionSample-Bridging-Header_h.png

対処法

この問題は、メッセージの通り、テストプロジェクトにおいて指定されたHeaderFileが見つからないことが原因です。

アプリプロジェクトの設定

見つからないと言われたHeaderをPublic Headerにする

Xcodeのアプリプロジェクトの設定から、 Build Phases -> +ボタン -> New Headers Phase を選びます。

OtherViews_と_DeepTransitionSample_xcodeproj.png

すると、Headers という項目が追加されるので、そこの Public となっている部分に Headerを全部追加します。
これでその Headerファイルは Public になります。

DeepTransitionSample_xcodeproj.png

Public Header を置く場所を変更する

デフォルトの設定だと、Build Dirのアプリプロジェクト側のDIR配下にHeaderファイルが置かれるようで、
それ故にテストプロジェクトから見つからないみたいです。

そこで Build Settings -> Public Header Folder Path の値を MyHeaders とかにします。
この MyHeaders は何でも良いです。もう少し良い名前をつけてあげてください。(単にMyHeadersと書けばよいです。その前に何も付けないでください)。
項目がやたら多いので、右上の検索バーに Public とか入れると見つけやすいです。

DeepTransitionSample_xcodeproj.png

テストプロジェクトの設定

今度はテストプロジェクトです。アプリプロジェクトで置いてもらったMyHeadersのDIRを探すようにします。

Build Settings -> Header Search Paths -> $(CONFIGURATION_BUILD_DIR)/MyHeaders

とします。 テストプロジェクト側のTargetに設定するということを間違えないようにしましょう(下図の①)。

DeepTransitionSample_xcodeproj.png

Clean して Build

これでOKです。
一旦、CleanしてBuildすれば今度は治っているのではないかと思います。

さいごに

この手のBuild エラーほど時間の浪費はないですね。
こういうことが起こったらチェックしてみてください。