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する方法の一つ。