SwiftのOptional型について深く調べてみたのでメモ。
Optional型の概要
Optional型とは下のように?付きで宣言された変数の型の事を指します。
// この2つはOptional型 let a: Int? = 1 let b: String? = 1
そうなってくると「上の変数はInt型でありOptional型ってこと?」って思うのですが、実は上の変数はInt型ではなくOptional型なのです。
下の例を見てもらうと分かる通り、Int?と言うのはOptional
let a: Int? = 1 let b: Optional<Int> = 1 print(a == b) // → true
Optional型の中身
Optional型の実装ですが、下の通り列挙型になります。
enum Optional<T> : Reflectable, NilLiteralConvertible { case None case Some(T) // メソッドは省略... }
下の通り、NoneとはnilでSomeはnil以外になります。
let a : Optional<Int> = nil let b : Optional<Int> = 1 print(a == Optional.None) // → true print(b == Optional.Some(1)) // → true
その他
Optional型のアンラップ
先日の記事でも書いたのですが、変数に!を付ける事はアンラップと呼びます。
これはオプショナル型の変数から中身を取り出す事です。
let a : Int? = 1 print(a) // → Optional(1) print(a!) // → 1 アンラップする事でInt型の1を習得
Optional型の中にOptional型を入れる
Optional型は実は下のように2重にする事ができます。
使う事があるかは分からないですがなんとなく面白いですね。
let a : Int?? = 1 print(a) // → Optional(Optional(1)) print(a!) // → Optional(1) print(a!!) // → 1 let a : Int?? = 1 print(a) // → Optional(Optional(1)) print(a!) // → Optional(1) print(a!!) // → 1