Optional Typeに関してのPatternをWWDCのVideoで幾つか見つけた。
Non Optional Typeにはnilは入れられない
これらは当然OKだが
var s: String = "This is String"
var c: MyClass = MyClass()
これはだめ。値がないということがNon Optional Typeでは認められないらしい。
これは安全なプログラムを書くことに貢献するので非常に嬉しい。値がないケースを考えたかったら
Optional Typeを使いましょう
var s: String = nil // Compile Errorになる
var c: MyClass = nil // Compile Errorになる
if let
パターン
Optional Typeでは値がない場合があるので、使うときには判定してあげないといけない
Optional Typeはif文の中に突っ込めるのでnaiveにやるとこんな感じ。
Optional Typeを返す何かしらの関数
let array: String[] = ["A", "B", "C", "D", "E"]
func findIndexOfArray(s: String, array: String[])-> Int? {
for (index, value) in enumerate(array) {
if value == s {
return index
}
}
return nil
}
ただしコレはエラーになる。
let ret = findIndexOfArray("C", array)
if ret {
println("\(array[ret]) exists") // Compile Error
} else {
println("not exists")
}
Optional TypeはそのままだとWrapされた値を参照できないので!
マークを使ってUnwrapさせる必要がある。
let ret = findIndexOfArray("C", array)
if ret {
println("\(array[ret!]) exists") // Unwrap ret value
} else {
println("not exists")
}
もう少しかっこよくやるにはlet
をif
の中に含めてしまう手がある。
if let ret = findIndexOfArray("C", array){
println("\(array[ret]) exists")
} else {
println("not exists")
}
こうすることでif clauseの中でコンパイラは自動的にretの値をUnwrapしてくれる。
Optional Chaining
でも値があるかどうかをいちいちif let
で判定していくとネストが深くなるしわかりづらい。
なのでOptional Chainingという方法がある。Optional型を返すものは繋げられるのだ。
let addressNumber = paul.residence?.address?.buildNumber?.toInt()
それぞれがOptional Typeを返す部分でどこかでnilが返ってきた場合全体の評価値もnilになる。
エラーにはならない。このように書くことで簡単に深い構造での値の存在確認ができる。