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 で検索してみてください。
Debug とつく configuration は、プロジェクトが新規作成された時の Debug configtaion を複製して作ったので、Combined で見たら、Project の Build Settings のデフォルトの設定を継承して DEBUG と入っていると思います。
ここで build configuration ごとの compilation condition が設定でき、#if DEBUG の DEBUG はここからきています。
DEBUG 用の configutaion かどうかだけを特定したいだけであればこのままでいいですね。
Debug、Release を問わず環境 (scheme) を特定したいのであれば、次のような感じで設定しても良いと思います。
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 でも別のコードを実行したいのであれば、次のようにできます。
この場合は以下のような感じで compilation condition に応じて、それぞれ違うコードを実行できます。
#if DEV
...
#elseif QA
...
#else
...
#endif
#if Debug
...
#else
...
#endif
以上、Swift で、どの configuration で実行されているかを特定する方法をご説明しました。