読者です 読者をやめる 読者になる 読者になる

SwiftでTupleとCaseを組み合わせて使う

環境: Swift2.2

タプルとcaseを組み合わせて使うと便利だったのでメモ。

Switch(case)文で使う

オプショナル型な複数の値の組み合わせで場合分けしたい場合に使う。
また値はアンラップして取り出して変数にバインドする。
ポイントはcase部分で「?」をつけること。これでオプショナル型でnilでない場合にマッチする。

let num: Int? = ...
let str: String? = ...

switch(num, str) {

case let (num?, str?): // num, strともオプショナル型でnil以外にマッチ
// case let (.Some(num), .Some(str)): // これでもよい
    print("num: \(num), str: \(str)")

case (let num?, nil): // numはオプショナル型でnil以外、strはnilにマッチ
// case (.Some(let num), nil): // これでもよい
    print("num: \(num)")

case case (nil, _?): // numはnil、strはオプショナル型でnil以外にマッチ
// case (nil, .Some(_)): // これでもよい
    break

default: // num、strともにnilにマッチ
    break
}

if letの代わりにif case letに使う

オプショナル型な値をアンラップして変数にバインドする場合に通常はif letを使うが、その代わりにタプルとif case letを組み合わせて使う。
これもポイントはcase部分で「?」をつけること。
複数の値を一気にバインドさせる場合にはif letより可読性が高いと個人的には感じた。

if let

if let foo = foo,
  let bar = bar,
  let hoge = hoge {

}

if case let

if case let (foo?, bar?, hoge?) = (foo, bar, hoge) {

}

パターンマッチ構文は以下記事がとてもよかったのでリンク。

Swift2のパターンマッチ構文集(ほぼ翻訳) - Qiita
http://qiita.com/mono0926/items/f2875a9eacef53e88122