Bridging Header vs Module Map
今回は昨日の import と Link
の記事に引き続き、Bridging Header や Module Map について簡単にまとめていきたいと思います。
Bridging Header
Bridging Header は Objective-C で書かれたコードを Swift で利用する仕組みで、それぞれの Objective-C 製ライブラリのヘッダーファイル(**.h
) を、ファイルに import することで Swift 側から公開されているシンボルにアクセスできるようになります。Bridging Header はアプリケーションターゲットとしてのみ作用するのでフレームワークの開発などでは使用することができません。また、これらはグローバルに作用するので、特定のファイルのみに Import するということは基本的にはできません。
Module Map とは?
Module Map は Bridging Header の上位互換で、Objective-C または C で書かれたライブラリの場合は、Modules
ディレクトリの中に module.modulemap
というファイルを設定することで、Swift 側からシンボルにアクセスできるようにします。Swift が登場して移行の Xcode で Objective-C 製のライブラリなどをビルドした場合は自動的に module.modulemap
ファイルが生成されます。
そもそもモジュールとは?
Swift が Framework および Library をインポートする際に必要なもので、Framework の Public な API の宣言です。Swift で書かれた Framework の場合は Framwork の中に下記のようなモジュールが存在し、これらはコンパイラによって自動的に生成されます。実態は .swiftmodule
という拡張子のファイルが Module です。
- Hoge.swiftmodule - arm64.swiftdoc - arm64.swiftmodule ⭕️ - x86_64.swiftdoc - x86_64.swiftmodule ⭕️
Objective-C/C 製の Framework などの場合は Module Map
についての説明でも触れたように、module.modulemap
で Framework の **.h
ファイルを Module に変換することで、Swift から Framework をインポートできるようになります。
また、これらの Objective-C/C 製の Framework などの場合は、Modules(module.modulemap
) を Framework バンドル外に配置することも可能で、下記がインポートする際に必要となる設定となります。
Framework バンドル内に Module がある場合
FRAMEWORK_SEARCH_PATHS
に Framework があるディレクトリの親ディレクトリの Path を指定します。
Framework バンドル外に Module がある場合
SWIFT_INCLUDE_PATHS
に module.modulemap
のあるディレクトリの親ディレクトリを指定します。