これは予想されるコンパイラの動作であり、非常に正当な理由があります。
私は、彼らはから切り替えた後、この問題に実行している人々の大部分が発生していると思うApplication Target
のFramework Target
と、フレームワークのにCとObjective Cヘッダの追加を開始アンブレラヘッダそれは同じ振る舞い持つように期待して、アプリケーションのブリッジングヘッダー動作が異なります。アンブレラヘッダーは、実際にはスウィフトとobj-cの混合フレームワーク用に指定されており、その目的は、フレームワークがObjective-CまたはCに持つ外部の世界にAPIを公開することです。つまり、そこに配置するヘッダーはパブリックスコープにある必要があります。
フレームワークの一部ではないObjective-C / Cヘッダーをフレームワークの迅速なコードに公開する場所として使用しないでください。その場合、これらのヘッダーは、フレームワークモジュールの一部として外部の世界にも公開されるため、モジュール性が損なわれるため、多くの場合、これは目的ではありません。(そして、その理由を正確にされて非モジュラーフレームワークモジュールに含まれています。デフォルトNO)
Objective-C / CライブラリをフレームワークのSwiftコードに公開するには、そのようなライブラリ用に別のSwiftモジュールを定義する必要があります。次に、標準のSwift import YourLegacyLibrary
を使用できます。
これをいくつかの典型的なシナリオで実証してみましょう:libxml2
フレームワークへの埋め込み。
1.最初に、次のようなmodule.modulemap
ファイルを作成する必要があります。
OSXフレームワークの場合:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
iOSフレームワークの場合:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
ヘッダーとそれが参照する他のすべてのヘッダーをswiftモジュール内にラップすることで、swiftがこれらのCインターフェイスのswiftバインディングを生成できるようになります。
2.次に、xcodeプロジェクトディレクトリにフォルダーSwiftLibXML2
を作成し、このmodule.modulemapをそこに配置します
3.でビルド設定は、追加$(SDKROOT)/usr/include/libxml2
のヘッダ検索パス
4.ではビルド設定、追加$(SRCROOT)/SwiftLibXML2
のインポートパス
5. ProjectのGeneralタブで、Linked Frameworks and Librariesに追加libxml2.tbd
します。
次に、このモジュールを必要な場所にインポートします。
import SwiftLibXML2
(より完全なmodule.mapの例を確認したい場合は、Darwinのmodule.modulemapを参照することをお勧めします。/usr/include/module.modulemap
そこに移動するには、Xcodeコマンドラインツールをインストールする必要があります。OSX El CapitanのMissing / usr / includeを参照してください。)