LoginSignup
6
6

More than 5 years have passed since last update.

Rubyの「if a = b」とSwiftの「if let a = b」は意味が異なる

Last updated at Posted at 2015-04-28

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は次の動作をする。

  1. 代入
  2. 分岐

それぞれを分けて書くとこうなる。

b = false

# 代入
condition = (a = b) #=> false

# 分岐
if condition
  puts("true")
else
  puts("false")
end

まず、a = bで代入が行われる。
この部分がfalseに評価され分岐条件になるので、"false"が出力される。

Swiftの動作

一方、Swiftのif let a = bは次の動作をする。

  1. Optionalの判別
  2. 分岐
  3. 代入

それぞれを分けて書くとこうなる。

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

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6