61
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

if case let x?文の使いどころについて考えてみた

Posted at

Swift2が公開されて変更点を見ていたところ、次のような文法が追加されていました。

let someOptional: Int? = 42

if case .Some(let x) = someOptional {
    print(x)
}

if case let x? = someOptional {
    print(x)
}

要はパターンマッチがif文にも開放されたのですが、Optionalのためにわざわざこのif case let x?という糖衣構文が追加されています。

しかし一体これ何に使うの?という感じです。なぜなら同じような役割であればすでにif let構文があるからです。

let someOptional: Int? = 42

if let x = someOptional {
    print(x)
}

わざわざ文字数増やしてこれを使う理由がわかりません。

少し考えて、ちょっといいかなと思ったのが複数Optionalのアンラップです。
例えば3つのInt?型の変数があり、その3つの合計を計算するときのことを考えます。

let a: Int? = 10
let b: Int? = 11
let c: Int? = 12

これを計算するとき、Swift1.2だと次のようになります。

if let x = a, y = b, z = c {
	println(x + y + z)
}

問題無いですね。

これをcase let文にすると次のように変わります。

if case let (x?, y?, z?) = (a, b, c) {
	print(x + y + z)
}

どうでしょうか?好みもあると思いますが、個人的にはcase let文を使ったほうが見やすい気がします。

これを使って関数などでguard文と組み合わせ、Optionalを一気に外すみたいなやり方も
できるかなと思います。

func add(a: Int?, b: Int?, c: Int?) -> Int? {
    guard case let (a?, b?, c?) = (a, b, c) else {
        return nil
    }
    return a + b + c
}
61
45
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
61
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?