iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

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 するということは基本的にはできません。

developer.apple.com

Module Map とは?

Module Map は Bridging Header の上位互換で、Objective-C または C で書かれたライブラリの場合は、Modules ディレクトリの中に module.modulemap というファイルを設定することで、Swift 側からシンボルにアクセスできるようにします。Swift が登場して移行の XcodeObjective-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_PATHSmodule.modulemap のあるディレクトリの親ディレクトリを指定します。

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com