Swift でどの configuration で実行されているかを特定する方法 - #if DEBUG とは?

Xcode で環境ごとの設定を管理する方法」では、開発、QA、本番環境用に build configration と schema を作って、環境ごとの設定ができるようにしました。

アプリの実行時に、どの build configration を選択して実行されているかを特定して、それによって違う処理をしたい時があるかもしれません。

ここでは、Swift で、どの configuration で実行されているかを特定する方法をご説明します。

Build Configuration と Scheme は追加済の前提ですすめますので、まだの方は「Xcode で環境ごとの設定を管理する方法」の目次に戻って追加・設定してください。


Swift でどの configuration で実行されているかを特定する方法

Swift でデバッグモードかどうかを確認する時に、次のようなコードを見たことがあるかもしれません。

#if DEBUG
[コードブロック A]
#else
[コードブロック B]
#endif

これは、conditional compilation block というもので、この部分はコンパイル時に指定した compilation condition オプションによって評価されて true の部分がコンパイルされて実行されます。

ですので、上のコードは compilation condition オプションが DEBUG の時は [コードブロック A] が、そうでない時は [コードブロック B] がコンパイルされて実行されるということになります。


この compilation condition オプション使って、実行時に選択された build configration が特定することができます。

以下のように TARGET のプロジェクト名をクリックし、Build Settings タブで Active Compilation Condition で検索してみてください。

Swift で、どの configuration で実行されているかを特定する方法 1


Debug とつく configuration は、プロジェクトが新規作成された時の Debug configtaion を複製して作ったので、Combined で見たら、Project の Build Settings のデフォルトの設定を継承して DEBUG と入っていると思います。

ここで build configuration ごとの compilation condition が設定でき、#if DEBUG の DEBUG はここからきています。

DEBUG 用の configutaion かどうかだけを特定したいだけであればこのままでいいですね。


Debug、Release を問わず環境 (scheme) を特定したいのであれば、次のような感じで設定しても良いと思います。

Swift で、どの configuration で実行されているかを特定する方法 2


Swift のコード側は、例えば label という名前の UILabel のアウトレットの text にコンパイル時に選択された環境 (scheme) を表示したいのであれば、次のようにすることができます。

#if DEV
label.text = "Development"
#elseif QA
label.text = "QA"
#else
label.text = "Production"
#endif

もちろん、それぞれの環境 Debug、Release で全て違う値を設定して、選択された configuration を特定することもできますし、compilation condition オプションを複数設定することもできます。

例えば、環境ごとに加えて、Debug・Release でも別のコードを実行したいのであれば、次のようにできます。

Swift で、どの configuration で実行されているかを特定する方法 3


この場合は以下のような感じで compilation condition に応じて、それぞれ違うコードを実行できます。

#if DEV
...
#elseif QA
...
#else
...
#endif

#if Debug
...
#else
...
#endif

以上、Swift で、どの configuration で実行されているかを特定する方法をご説明しました。

© 2024 iOS 開発入門