9
5

More than 1 year has passed since last update.

プリプロセッサーの定義方法(Swift・Objective-C)

Last updated at Posted at 2022-05-30

はじめに

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
スクリーンショット_2022-05-30_23_10_20.png

SwiftではOther Swift Flagsで -D QA のように指定します。

以下の例では、ビルド構成が DEBUG または QA の場合に #if ... #endif 内の処理がビルドに含まれます。

Foo.swift
#if DEBUG || QA
...
#endif

Objective-C

PROJECT > Build Settings > Apple Clang - Preprocessing > Preprocessor Macros
スクリーンショット_2022-05-30_23_11_25.png

Objective-CではPreprocessor Macrosで QA=1 のように指定します。

#if ... #endif の書き方はSwiftと同様です。

Foo.h
#if DEBUG || QA
...
#endif

.h ファイルのみでなく .m ファイルでも同じように書けます。

Foo.m
#if DEBUG || QA
...
#endif

ただSwiftとObjective-C(C言語)でプリプロセッサーの条件分岐の書き方は異なります。
Objective-Cでこの書き方だと、 DEBUGQA が未定義の場合に予期せぬ動作になるかもしれません。

定義されているかどうかを判定したい場合、 defined() を使うのが無難です。

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

参考リンク

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5