オプショナル型=変数にnilの代入を許すデータ型
宣言方法:変数のデータ型の最後に”?”か”!”をつける
var name: String?
var age: Int!
※オプショナル型の変数は宣言をしただけで初期化をしなかった場合、nilが入っている
暗黙的アンラップ型”!” =使用する際に自動でアンラップされる
オプショナル型の宣言には”?”か”!”を用いますが、”!”を用いて宣言したオプショナル型(暗黙的アンラップ型)は下記のように使用する際に自動でアンラップされます。
"?"で宣言したオプショナル型の場合、非オプショナル型とは計算できない
var x: Int = 5 // 非オプショナル型
var y: Int? = 10 // "?"で宣言したオプショナル型
x + y
# => エラー
"!"で宣言したオプショナル型の場合、自動でアンラップされるため非オプショナル型と計算できる
var x: Int = 5 // 非オプショナル型
var y: Int! = 10 // "!"で宣言したオプショナル型(暗黙的アンラップ型)
x + y
# => 15
暗黙的アンラップ型は、
最初はnilで宣言⇒使用時には絶対に値が入っている(nilではない)
という使い方の際に使用します。
そのため、使用するときに変数の値がnilのときにはエラーとなりますので要注意です。
アンラップ=オプショナル型から値を取りだす
アンラップの方法は下記3通り
1. Forced Unwrapping (強制的アンラップ)
オプショナル型を強制的にアンラップする方法で、
オプショナル型の後ろに”!”をつける
2. Optional Binding (オプショナルバインディング)
オプショナル型の変数に値が入ってる⇒アンラップ⇒処理{}を実行
オプショナル型の変数に値がない(=nil)⇒処理{}を行わない、もしくはelse{}の処理を実行
var test: String? // オプショナル型
if let testUnwrapped = test {
println(testUnwrapped)
}
else {
println("テストはありません")
}
if let 変数2 = 変数1{} はSwiftでよく使われるnilチェックの方法
if let hogehoge = hogehogeValue {
//nilでない場合実行される処理
}
※他にもあるエラーハンドリング
if let 変数2 = try? 変数1 {}
try?はエラーが発生するとnilを返すオプショナル型変数、この組み合わせでエラーにならないようにしています
3. Optional Chaining(オプショナルチェイニング)
オプショナル型の変数に続けてプロパティを取得したり、メソッドを呼び出す場合に使用する、戻り値はオプショナル型になる。
戻り値がオプショナル型となるため、オプショナル型の変数の中身がnilの可能性があってもプロパティを取得したり、メソッドを呼び出せる。
使用方法:オプショナル型の変数のあとに”?”をつける
オプショナル型の変数?.プロパティ
オプショナル型の変数?.メソッド()
【例1】
var animal1: Animal? = Animal()
var animal2: Animal?
// nilでないためプロパティが取得できる
animal1?.type
// => "Optional(ねこ)"
// nilでないためメソッドを呼び出せる
animal2?.call()
// => "Optional(わんわん)"
var animal1: Animal? = Animal()
var animal2: Animal?
// animal1がnilの場合、nilが返る
animal1?.type
// => nil
// animal2がnilの場合、nilが返る
animal2?.call()
// => nil
【例2】
var x: String?
Var y = x?.uppercased()
// => nil