if文にBool?をそのまま投げると非直感的な評価をされる話(昔話)

注意

この挙動はβ5で変更されました。 具体的にはif optionalFalseが禁止され、nil判定はif optionalFalse != nilと明示的に書くようになりました。これによって以下のような曖昧さはなくなります。

以下は昔話として残しておきます。

昔話

if文の条件式にOptional型を渡すと(当然ながら)nilか否かで判定が行われる。

したがって以下は当然の帰結である。

let optionalFalse: Bool? = false

if optionalFalse { println("\(optionalFalse) Evaluated as true") }
// prints: "Optional(false) Evaluated as true"

ちゃんとunwrapしなくてはいけない。

if optionalFalse! { println("\(optionalFalse) Evaluated as true") }
// prints nothing

ところでこれは:

if !optionalFalse! { println("?") }
// prints "?"

!(optionalFalse!) = !(false) = trueと評価されるらしい。(!optionalFalse)!は評価できない。