5
5

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.

Pattern of Optional type

Last updated at Posted at 2014-06-14

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")
} 

もう少しかっこよくやるにはletifの中に含めてしまう手がある。

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になる。
エラーにはならない。このように書くことで簡単に深い構造での値の存在確認ができる。

参照:Intermediate Swift

5
5
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
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?