はじめに
SwiftとObjective-Cでプリプロセッサーの定義場所が異なってつまづいたので、備忘録がてら紹介します。
環境
- OS:macOS Monterey 12.3.1
- Xcode:13.2.1 (13C100)
- Swift:5.5.2
プリプロセッサーの定義方法
プリプロセッサーの定義方法を紹介します。
Swift
PROJECT > Build Settings > Swift Compiler - Custom Flags > Other Swift Flags

SwiftではOther Swift Flagsで -D QA のように指定します。
以下の例では、ビルド構成が DEBUG または QA の場合に #if ... #endif 内の処理がビルドに含まれます。
#if DEBUG || QA
...
#endif
Objective-C
PROJECT > Build Settings > Apple Clang - Preprocessing > Preprocessor Macros

Objective-CではPreprocessor Macrosで QA=1 のように指定します。
#if ... #endif の書き方はSwiftと同様です。
#if DEBUG || QA
...
#endif
.h ファイルのみでなく .m ファイルでも同じように書けます。
#if DEBUG || QA
...
#endif
ただSwiftとObjective-C(C言語)でプリプロセッサーの条件分岐の書き方は異なります。
Objective-Cでこの書き方だと、 DEBUG や QA が未定義の場合に予期せぬ動作になるかもしれません。
定義されているかどうかを判定したい場合、 defined() を使うのが無難です。
- #if DEBUG || QA
+ #if defined(DEBUG) || defined(QA)
...
#endif
SwiftとObjective-Cが混在している場合は注意
SwiftとObjective-Cが混在している場合、Other Swift Flagsのみ定義していると、Objective-Cのコードでプリプロセッサーが未定義となり予期せぬ動作になります。
私はここでつまづいて時間を溶かしました。
Preprocessor Macrosの定義を忘れないよう気をつけましょう。
おわりに
これでSwiftとObjective-Cの両方でプリプロセッサーを定義できるようになりました!