はじめに
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の両方でプリプロセッサーを定義できるようになりました!