【Swift】Generated Header内にSwiftクラスの定義が記述されない場合の確認事項【Xcode6】
公開日:
:
iOSアプリ開発
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
Swiftで書いたクラスをObjective-Cで使う際には、「Generated Header」と呼ばれるヘッダーファイルをimportする必要があります。このGenerated HeaderファイルはXcodeが自動で生成するものであり、開発者が自分で用意する必要はないのですが、このファイル内にSwiftで書いたクラスに関する定義が現れず、結果としてSwiftで書いたクラスを使用できなくなる状況に遭遇したので、その解決策を記しておきます。
「Bridging Header」を用意する
Objective-Cで書いたクラスをSwift側で使用するための「Bridging Header」ファイルを用意してプロジェクトに追加します。中身は空でも良いですが、使用したいObjective-Cのクラスがあれば、そのヘッダーファイルに関するimport文を追加する必要があります。
Swiftで書いたクラスをObjective-Cで使うだけの場合は「Bridging Header」ファイルが不要なようにも思えますが、このファイルを用意しない場合に問題が発生したので作成しておきます。詳しくは後述。
Objective-Cで使いたいSwiftクラスの準備
Objective-Cで使いたいSwiftクラスは、NSObjectを直接 or 間接的に継承するか、@objcを付ける必要があります。
「Packaging」設定を確認する
ターゲットの「Build Settings」→「Packaging」を開き、「Defines Module」をYesに、そして「Product Module Name」が設定されていることを確認します。Product Module Nameは後ほど使用します。
「Build Options」設定を確認する
ターゲットの「Build Settings」→「Build Options」を開き、「Embedded Content Contains Swift Code」がYesになっていることを確認します。
「Swift Compiler – Code Generation」設定を確認する
ターゲットの「Build Settings」→「Swift Compiler – Code Generation」を開き、「Install Objective-C Compatibility Header」がYes、そして「Objective-C Bridging Header」に先ほど作成したBridging Headerが設定されていることを確認します。
Swiftで書かれたクラスをObjective-C側で使用するだけなら後者の設定は不要に思えますが、ここを空にしておくとGenerated Header内にSwiftクラスの定義が記述されない現象が発生しました。
「Generated Header」をインポートする
Swiftで書かれたクラスを使いたいObjective-Cソース内でGenerated Headerファイルをインポートします。ファイル名は先ほど設定したProduct Module Nameを使って「(Product Module Name)-Swift.h」とします。
このファイルはXcodeによって自動生成されるので、開発者が作成する必要がありません。
Generated HeaderファイルをCommand+クリックして開くと、最後の方にSwiftクラスの定義が書かれているのが確認できます。
Clean & Rebuild
念の為にCleanして、再度Buildを実行しましょう。
@akio0911はこう思った。
「Objective-C Bridging Header」を設定しないとSwiftクラスの定義が記述されないというのは一番のハマリポイントだったので、皆さんお気を付け下さい!
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!