非オプショナル型
// 何もついてない場合は、非オプショナル型
let nonOptional: Int = 1
// type(of)で型名を調べてみると
type(of: nonOptional) //-> Int
オプショナル型
// ?がついてたらOptional<Wrapped型>
let optional: Int? = 1
type(of: optional) //-> Optional<Int>
// ?は実はシンタックスシュガーで以下と同義
let optionalFull: Optional<Int> = 1
type(of: optionalFull) //-> Optional<Int>
オプショナル型を非オプショナル型にアンラップする方法は2つある
// ① オプショナルバインディングを使う
if let notOptional1: Int = optional {
// アンラップ対象のオプショナル型がnilの場合はこのIf文に入らない
type(of: notOptional1) //-> Int
}
// ② 強制アンラップする
let nonOptional2: Int = optional!
// 非オプショナル型に代入する時に!をつけることでアンラップされる
// ただし、nilが入っていると例外が発生する。
ImplicitlyUnwrappedOptional型
// 変数名ではなく型名に!をつけることで、
// 「暗黙的に矯正されるオプショナル型」を宣言できる
let impUnwrappedOptional: Int! = 1
type(of: impUnwrappedOptional) //-> ImplicitlyUnwrappedOptional<Int>
// これを非オプショナル型に代入できる
let unwrappedOptional: Int = impUnwrappedOptional
// ただし、これも強制アンラップと同じでnilの場合に例外が発生する。