Objective-C のコード内で @import が使えないとき
Swift プログラミング
Objective-C で自作フレームワークを @import しようとしたところ思いがけず modules are disabled エラーでハマってしまったので、その解消方法について記しておくことにします。
自作の Objective-C フレームワークに modulemap を定義して、他のプロジェクト内の Objective-C ソースコードから @import
で取り込めるようにしてみたのですけど、いざ使ってみるとプロジェクトによっては次のビルドエラーが発生してしまいました。
Use of '@import' when modules are disabled
ちなみにフレームワークをモジュールとして扱うことで、具体的なヘッダーファイル名を #import
するのではなく、モジュール名を @import
することで、それが持っている機能を利用できるようになる仕組みです。このとき #import
のときと違って @import
したモジュールは自動的に読み込まれるため、必要なフレームワークをプロジェクトの設定でインポートする必要がないのも嬉しいところです。
プロジェクトで Objective-C モジュールの使用を有効化する方法
モジュール機能を有効化する
利用できない理由でよくあるのが、プロジェクトの設定で
Enable Modules (C and Objective-C)
が No
に設定されているためのようです。
これを Yes
に設定することで、基本的には @import
を使ったモジュールの取り込みが可能になります。
Objective-C++ では使えない様子
ただ、上記のように設定しても、Objective-C++ ソースコード内や、そこから #import
されている C ヘッダーファイル内では @import
を利用できない様子でした。そのようなときも、先ほどと同じ Use of '@import' when modules are disabled
が発生します。
このようなときは、モジュールに頼らず #import
を使うか、必要がなければ Objective-C++ を使わないようにすることで解消できる様子でした。
たとえばいくつかのファイルで Objective-C++ が必要で、惰性でそれ以外の Objective-C で充分なファイルも拡張子が *.mm
になっていたりした場合は、それらを *.m
にしてあげるだけでも、少なくともそれらに関連するファイルでは @import
が使えるようになります。