Help us understand the problem. What is going on with this article?

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

More than 5 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 エラーほど時間の浪費はないですね。
こういうことが起こったらチェックしてみてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした