SwiftはRubyに似ている(c.f. Swiftは○○に似ている)。
しかし、見た目は似ているけれど意味が異なる構文がある。
Rubyのif a = b
"false"が出力される。
b = false
if a = b
  puts("true")
else
  puts("false")
end
Swiftのif let a = b
"true"が出力される。
let b:Bool?
b = false
if let a = b {
    println("true")
} else {
    println("false")
}
どうしてこうなった
Rubyの動作
Rubyのif a = bは次の動作をする。
- 代入
 - 分岐
 
それぞれを分けて書くとこうなる。
b = false
# 代入
condition = (a = b) #=> false
# 分岐
if condition
  puts("true")
else
  puts("false")
end
まず、a = bで代入が行われる。
この部分がfalseに評価され分岐条件になるので、"false"が出力される。
Swiftの動作
一方、Swiftのif let a = bは次の動作をする。
- Optionalの判別
 - 分岐
 - 代入
 
それぞれを分けて書くとこうなる。
let b:Bool?
b = false
// Optionalの判別
let condition = (b != nil) // true
// 分岐
if condition {
    // 代入
    let a = b!
    println("true")
} else {
    println("false")
}
まず、b != nilでOptionalの判別が行われる。
分岐条件がtrueなので、let a = b!でforce unwrap&代入した後、"true"が出力される。
これは「optional binding」と呼ばれる機能で、Optional型の変数をunwrapする方法の一つ。