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

【swift】Optional Bindingについて

前回swiftでのnilの取り扱いについてまとめました。

今回はnilを取り扱う時に便利な記法のOptional Bindingについてまとめます。

Optional Binding

必要になるケース

例えば、関数の中には返り値がOptionalなものがあります。
配列からindexの値を取得するfindなどがそうです。

var array: [String] = ["a", "b", "c"]
find(array, 'c') // 2
find(array, 'd') // nil

そこで、findの返り値を定数に代入してみます。

let index: NSNumber = find(array, 'd') // nil

これはコンパイルエラーになります。 定数indexはoptionalな定数ではないので、nilは代入できません。

let index: NSNumber? = find(array, 'd') // nil

Optionalにすればnilを代入できるようになるので、コンパイルが通るようになります。
次は、このindexの値をもとに配列から要素を削除してみます。

array.removeAtIndex(index)

これはコンパイルエラーになります。
indexはオプショナルな定数なので!をつける必要があります。

array.removeAtIndex(index!)

これは、コンパイルは通りますが、indexnilなので、ランタイムエラーが発生します。

つまり

indexの値がnilじゃ無いときに、配列から要素を削除したいのです。

これを、Optional Bindingを使用しないとこんな感じになると思います。

var array: [String] = ["a", "b", "c"]
let index: NSNumber? = find(array, "d")

if index != nil {
  array.removeAtIndex(index!)
}

いちいちindexを定義してnil判定するのはとても面倒です。

そこでOptional Bindingを使用します。

var array: [String] = ["a", "b", "c"]
if let index: NSNumber = find(array, "d") {
  array.removeAtIndex(index)
}

定数の定義とnil判定を同時に行うことができます。

ifのブロックの中は値がnilじゃない時に実行されるため、定数はoptionalではありません。
そのため、!も必要無くなります。

以上、Optional Bindingまとめでした。