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 が使えるようになります。