xyk blog

最近は iOS 開発の記事が多めです。

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 case letでパターンマッチが利用できる。
オプショナルをアンラップして変数にバインド。
これもポイントはcase部分で「?」をつけること。

// a は Optional
if case let x? = a {
}

// 以下と同じ
if case .Some(let x) = a {
}

そしてタプルを組み合わせて使うと、複数の値を一気にバインドできる。
if letよりスッキリ書ける気がする。

if let

// a, b, c は Optional
if let x = a,
  let y = b,
  let z = c {

}

if case let

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

}

参考:

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