強制アンラップ、オプショナル型 - ntuf/Tips GitHub Wiki

強制アンラップ、オプショナル型どこよりも分かりやすいSwiftの"?"と"!" https://qiita.com/maiki055/items/b24378a3707bd35a31a8

var age: Int?  var name: String! オプショナル型の特徴は変数にnilの代入を許す オプショナル型を使うことでnilを扱うことができるようになります。

delegate?.callDelegateMethod()label.setFont(font!) 変数の宣言のとき以外に使う"?"や"!"はオプショナル型とは別物

非オプショナルな変数は使う前に必ず何らかの値を入れてあげなくてはいけません var piyo: String = "Hello World" 値を入れないとコンパイルエラー piyo = nil nilを代入しようとするとコンパイルエラー なぜnilを扱うのか ・必須でない項目・データを一旦破棄する必要がある場合など "!"は暗黙的アンラップ型(Implicitly Unwrapped Optional)

var hoge: Int? = 10 println(hoge)// => Optional(10)  Optionalという記述がつく「値」と「Optional(値)」は異なるものです。つまり、同様には扱えません。 Optional や Array は値を入れる箱と考える

var a: Int  = 10 // 非オプショナル型 var b: Int? = 10 // オプショナル型 a + b// => エラーが起きる そのため、アンラップが必要 代表的なアンラップの方法は以下 ①Forced Unwrapping (強制的アンラップ) ②Optional Binding (オプショナルバインディング) ③Optional Chaining (オプショナルチェイニング)

①強制的アンラップ var a: Int  = 10 // 非オプショナル型 var b: Int? = 10 // オプショナル型 a + b!# => 20欠点 変数の中身がnilだった場合、実行時エラー なので ②オプショナルバインディングをする var hobby: String? // オプショナル型 if let unwrappedHobby = hobby {    println(unwrappedHobby)}else {    println("趣味はありません")} 要するに if var 変数名 = オプショナル型の変数 { 処理 }

さらに ③オプショナルチェイニング オプショナル型の変数?.プロパティオプショナル型の変数?.メソッド() 変数をアンラップし、中身を取り出します。そして、それに続くプロパティを取得したり、メソッドを呼び出すことができます

オプショナルチェイニングに続けて取得したプロパティやメソッドの戻り値はオプショナル型になる。その値を使うには再度アンラップが必要

var human: Human? = Human()// nilでないためプロパティが取得できる human?.name// => "Optional(シンボ)"// nilでないためメソッドを呼び出せるhuman?.hello()// => "Optional(こんにちは)" オプショナル型の変数の中身がnilの場合、nilを返します。nilを返した後、それに続く処理をすべてキャンセルします。

var human: Human?// humanがnilのため、nilが返る human?.name// => nil// humanがnilのため、nilが返る human?.hello()// => nil

暗黙的アンラップ型"!" オプショナル型である"?"との違いは、使用するとき必ず強制的アンラップをする 暗黙的アンラップ型"!"で宣言すればアンラップする必要がない。なぜなら使用するときに自動でアンラップをしてくれるが注意が必要。

なるほどゆめみ社の課題を修正オプショナルバインディングに変更した。 後,オプショナルなのかな「??」ってなんなの?nil coalescing operator(??演算子)というものが使える。左辺がnilではない場合 -> 左辺を使う左辺がnilであった場合 -> 右辺を使う これでもnilの回避はできるけど、オプショナルバインディングの方がスマート