何を表しているのか?
Optional<Wrapped>
型は、値があるか空かのいずれかを表した型です。
何がうれしいのか?
Optional型にしてできることはnilを扱えるようになることです。
→nilについての処理を楽にできる。
Optionalの中身
enum Optional<Wrapped> {
case none
case some(Wrappped)
}
.noneが値の不在、すなわちnilと等しいケースで、
.someがWrapped型の値の存在を表すケースです。
let none = Optional<Int>.none
print(".none: \(String(describing: none))")
let some = Optional<Int>.some(1)
print(".none: \(String(describing: some))")
/*
.none: nil
.some: Optional(1)
*/
このことより、Optional型の.noneとnilリテラルが対応づけられていることがわかる。
定義方法
変数名:型名?
めっちゃ簡単やん!!
めんどいのはここから
let a:Int = 1
let b:Int? = 2
let c = a + b //コンパイルエラー
何故コンパイルエラーとなるのか
→Optional型はnilを扱う都合上そのままでは値が取り出せない仕様になっています。
つまり、型をOptional型で包んでいる感じです。
イメージとしては、Optionalという袋の中に型という食べ物が入っており、袋に入ったままだと、四則演算という料理に使えないと考えてください。
取り出したい!!
ForcedUnwrapping
!演算子によるOptional型の値の取り出し
!をつけることにより強制的にOptionalの殻を外すことができます
let a : Int? = 0
let b = a!
print(b) //0
メリット
・楽にunwrapできる。
デメリット
この方法では変数にnilが入っているかわからないため、安易にnilを代入してしまい、アプリのクラッシュに繋がるという最悪のことを避けるためになるべく使わないでおきましょう
オプショナルバインディング
if文による値の取り出し
条件分岐文や繰り返し文の条件にOptional型の値を渡し、値の有無に応じて処理を切替え、値が存在する場合はWrapped型の取り出す方法です。
let optionalA = Optional("a")
if let a = optionalA {
print(type(of: a))
}
//String
??演算子
値が存在しない場合のデフォルト値を指定する演算子
Optional型に値が存在しない場合のデフォルト値を指定するには、中間演算子の??を使用します。
let optionalInt : Int? = 1
let int = optionalInt ?? 3
print(int) //1
let optionalInt2 : Int? = nil
let int2 = optionalInt2 ?? 3
print(int2) //3