今回はボリュームが多いので、2回に分けて書いていきます。
・その1:オプショナルの概要
・その2:「オプショナルバインディング」と「オプショナルチェインニング」
Optional(オプショナル)
Swiftの定数、変数はnil(値なし。java等でいうnull)を代入できません。
これをOptional型でラップすることでnilを入れることができるようになります。
イメージが浮かばないと思うので
さっそく例を見ていきましょう。
通常はnilを代入できないため、下記の場合、エラーになります。
var myName:String = "yuinchirn" // "yuinchirn"
myName = nil // エラー
nilを代入したい場合は、
myName:Stirng?
のように型の後ろに?を付けます。
var myName:String? = "yuinchirn" // Optional("yuinchirn")
myName = nil // OK
この?が何なのかというと、
Optinal<String>
という形でString型をOptional型という型でラッピングするということをやっています。
つまり下記と同じ意味です。
var myName:Optional<String> = "yuinchirn" // Optional("yuinchirn")
myName = nil
これによってmyName
はOptinal型、オプショナルバリューになります。
オプショナルバリューの状態では、元の型のメソッド操作や値の操作ができません。
var myName:String? = "yuinchirn"
var newMyName = "new_" + myName // myNameがオプショナルバリューの状態なのでエラーになる。
これでは使い物にならないので、
元の型のメソッド操作や値の操作をしたい場合は、
一時的にオプショナルバリューをアンラップし元の型に戻してあげます。
その場合は変数名に!
をつけます。
今回の場合は"new_" + myName!
といった感じです。
var myName:String? = "yuinchirn"
myName = nil
var newMyName = "new_" + myName! // OK
オプショナルバリューがnilだった場合の初期値設定のやり方
オプショナルバリューがnilだった場合に
他の値を入れて後続の処理を行いたいというシチュエーションがあると思います。
その場合に使うのが、??
です。
var num:Int? // nil
let price = 500 * (num ?? 10) // numがnilなので10で計算される。
println(price) // 5000
上記のように([オプショナルバリュー]?? 値)
にすることで
[オプショナルバリュー]がnilの場合、[値]に設定された値が利用されます。
※但し、上記の場合にはnum
に10は代入されません。
var num:Int? // nil
num = 5
let price = 500 * (num ?? 10) // numが5なので5で計算される。
println(price) // 2500
もちろん上記のように、nilでなければその値が使われます。
オプショナルを使ったスマートなnilチェックの方法などを紹介した下記も合わせてご覧ください。
Swift さくっと確認したい基礎文法 [Optional(オプショナル) その2]