何でかわからないが、 Preprocessor Macros
にADHOC=1 やRELEASE=1を追加しても以下のコードが2が出力されてしまった。
#if DEBUG || ADHOC || RELEASE let i = 1 #else let i = 2 #end print(i) // -> 2
DEBUG=1 を入れておくと1になり、or演算子 を続けると無視されます。つまり、分かっていることとしては、or演算子が間違っているということ。
この考えは間違っていた。
解決策
preprocessor macros に定義するという考えが間違っていて、 Active Compilation Conditions
に値を定義すべきであった。DEBUGは初めから定義されているため、DEBUGの場合のみ動いているだけだった。
余談
メインのコード内でのマクロによる分岐をやめて、定数として定義して処理を分岐させた方が完結にコードがかけることに気がついた。
enum Configuration { case adHoc, debug, release } #if ADHOC let configuration = .adHoc #elseif DEBUG let configuration = .debug #elseif RELEASE let configuration = .release #endif let i = configuration != .release ? 1 : 2 print(i)
実行時間が長くなるもののコード全体としては、マクロによる影響が完結になったと思う。
まとめ
Preprocessor Macros
に定義してもマクロで使えないActive Compilation Conditions
に定義するとマクロで使える- マクロの影響範囲を小さくした方が完結な書き方ができてむしろ良かった