Xcode 6 / Beta 4:フレームワークターゲットでのブリッジヘッダーの使用はサポートされていません


131

Xcode 6 Beta 4にアップグレードし、Beta 2のライブビュー用に作成したフレームワークを用意しました。別の迅速なバグのため、いくつかのObj-Cコードを使用する必要がありました。しかし、アップグレードすると、次のエラーが発生します。

エラー:フレームワークターゲットでのブリッジヘッダーの使用はサポートされていません

私はリリースノートで何も見ていません、または他の移行パスを見つけていません。他の誰かがこれを見て解決策を見つけましたか?

Beta 3ではライブビューのフレームワークが不要になったことを理解していますが、私の場合、それを機能させることができれば理にかなっています。フォールバックとして削除することもできますが、ベータ4で完全に機能しない場合はフレームワークを使用することをお勧めします。


「ベータ3ではフレームワークの必要性がなくなったと思います」どうやって?
hnh

2
(ライブビュー用)-編集済み
Chris Conover、2014

1
同じ問題が発生しています。
Simon Germain

2
うわー、あなたの小さな編集は私の人生をとても良くしました-この変更(フレームワークの必要性を排除する)について聞いたことがなく、ライブビューのこれらのすべてのフレームワークターゲットで頭を叩いていたのです。この@chriscoをどうもありがとう!
yonix 2014年

回答:


232

エラーが示すように、ヘッダーのブリッジはフレームワークでは許可されていません。Mix&Matchアップルのドキュメントの「同じフレームワークターゲット内からのコードインポート」セクションは、このことを示唆しています。彼らが言うように、「あなたのアンブレラヘッダーファイルで、Swiftに公開したいすべてのObjective-Cヘッダーをインポートする」必要があります。

ただし、これらの特定のヘッダーも公開する必要がある場合があることを発見しました。この回答レビューなぜ、どのようにそれを行うには:スウィフトのコンパイラエラー:「フレームワークモジュール内部の非モジュラヘッダを」

だから、これを行います:

  1. ブリッジヘッダーファイルを削除します。
  2. フレームワークのビルド設定でブリッジヘッダーファイルへの参照を削除する
  3. 必要なヘッダーをアンブレラファイル([ProductName] .h)に追加します
  4. 含まれているファイルをフレームワークの「ビルドフェーズ」の「ヘッダー」セクションで公開します。
  5. クリーンして再構築します。

:「アンブレラヘッダーファイル」は、一般にフレームワークのすべてのパブリックヘッダーを表すファイル([ProductName] .hという名前)です。これは通常、フレームワークに含まれる他のヘッダーへの#importステートメントの単なるリストです。XcodeでUIKit.hを開くと、アンブレラファイルの良い例が表示されます。


3
簡潔な回答に感謝します(そのようにマークされています)。私はそのセクションを読みましたが、アンブレラとブリッジヘッダーの違いについて混乱しました。
Chris Conover、2014

1
@ zaxy78は、このドキュメントの「Importing Swift into Objective-C」セクションをご覧ください:developer.apple.com/library/ios/documentation/Swift/Conceptual/…–
DeepFriedTwinkie

4
@DeepFriedTwinkie、「アンブレラファイルに必要なヘッダーを追加して」と言ったときに、どのアンブレラファイルを参照していますか?ありがとう。
Allan Macatingrao

2
これはまさに私が必要としたものです。それらを公開セクションに追加することが修正でした。
olivaresF 2016年

20
フレームワーク内でプライベートにしたいクラスのうち、迅速なクラスで使用する必要のあるクラスを、私のフレームワークを使用するすべての人に公開する必要があると仮定して、私は正しいのですか?理想的なソリューションのようには見えません。
ospr

28

2つの可能性があります。アンブレラヘッダーファイルに必要なヘッダーを追加して公開するのも1つの方法です。ただし、Swiftでヘッダーを使用できるようにする必要があるが、パブリックではない場合、これは問題になります。

内部ヘッダーをSwiftで利用できるようにする2番目の可能性については、ここで詳しく説明します。基本的に、次のようなモジュールマップを作成する必要があります。

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

これは、次の設定を使用してXCodeに含めることができます。

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

2
優れた!ありがとう。すべてのヘッダーを公開するよりもはるかに好ましい手法。
デビッドH

他の人に対してその解決策を強くアドバイスし、詳細な解決策のために提供されているリンクを確認する
Tancrede Chazallet '14

これは、正しい答え芋しかし、あなたはどの助けスウィフト-にObjC相互運用機能を持つ多くのいくつかのアップルが提供するマクロを使用して逃げることができるかもしれ達成しようとしているものに応じて、次のとおりです。developer.apple.com/documentation/swift/ …
Joe Susnick

header文は、相対パスを受け入れます。別のフレームワークのヘッダーを追加する場合はどうしますか?
Georgios

13

Objective-CのSwiftへのインポートを参照してください。

同じフレームワークからObjective-CコードをSwiftにインポートするには

  1. [ビルド設定]の[パッケージ]で、そのフレームワークターゲットの[モジュールの定義]設定が「はい」に設定されていることを確認します。
  2. アンブレラヘッダーファイルで、Swiftに公開するすべてのObjective-Cヘッダーをインポートします。例えば:

        #import "XYZ / XYZCustomCell.h"
        #import "XYZ / XYZCustomView.h"
        #import "XYZ / XYZCustomViewController.h"
    
  3. 含まれているファイルをフレームワークの「ビルドフェーズ」の「ヘッダー」セクションで公開します。

  4. クリーンして再構築します。

Swiftは、アンブレラヘッダーで公開するすべてのヘッダーを表示します。そのフレームワーク内のObjective-Cファイルの内容は、インポートステートメントなしで、そのフレームワークターゲット内のすべてのSwiftファイルで自動的に利用できます。システムクラスで使用するのと同じSwift構文でカスタムObjective-Cコードを使用します。

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

重要:「アンブレラヘッダーファイル」とは、ファイル{ModuleName} .hを意味します。ところで、ターゲット名は{ModuleName} .frameworkです。


1
モジュールのSwiftファイル内でobjcファイルを使用したいのですが、それらを他のモジュールに公開したくありません。どうすればできますか?
Sazzad Hissain Khan

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.