言語仕様 [optional]
変数とnil,Optional型
- nil
- Optionalの省略記述を覚える前に、以下のフローで覚える
Optional型の宣言と初期化
- 宣言
var optionalStr: Optional<String>
- 初期化
var optionalStr: Optional<Int> = 255
Optional型のアンラップ
まず、宣言してメソッド呼び出してみる
var optionalStr: Optional<String> = "Swift" optionalStr.lowercaseString //コンパイルエラー
- Forced Unwrapping(強制アンラップ)
var optionalStr: Optional<String> = "Swift" // アンラップして変数に代入 var unwrappedStr: String = optionalStr! unwrappedStr.lowercaseString //swift // アンラップしてそのまま利用 optionalStr!.lowercaseString //swift
- nilチェックして利用
if optionalStr != nil { optionalStr!.lowercaseString }
- Optional Binding(チェック&アンラップ)
var optionaStr: Optional<String> = "Swift" if let unwrappedStr = optionalStr { unwrappedStr.lowercaseString //swift }
- Optional Chaining(型メソッドを利用目的のアンラップ)
var optionalStr: Optional<String> = "Swift" optionalStr?.lowercaseStrin //swift {some "swoft"} //Stringのメソッドを利用してるが戻り型はOptional
- Implicitly Unwrapped Optional(ややこしいけどここまでがんばれ)
var optionalStr: ImplicitlyUnwrappedOptional<String> = "Swift" optionalStr.lowercaseString //swift ※戻り型String
// 「!」が不要
// 宣言時、nilじゃないことが確定しているなら使う
Optional型の省略形
var optionalStr: String? = "Swift" // Optional型の場合 var optionalInt: Int! = nil //ImplicitlyUnwrappedOptionalの場合
上記の「?」「!」の記号は、 OptionalChainingの「?」やForced Unwrappingの「!」とは違う
まとめ
いろいろなサンプルコードを見てると、「?」やら「!」やらが頻発する。 この辺の言語仕様周りには変更がある為、これまで動いていたコードが動かなくなった場合、 最初に疑いたくなるのはこの言語仕様。 気になってソースが負えなくなるくらいなら、ここでサクッと覚えてるとしよう。