Swiftのマクロのorが動かなくてつまづいた

何でかわからないが、 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 に定義するとマクロで使える
  • マクロの影響範囲を小さくした方が完結な書き方ができてむしろ良かった