Optional型とは:
String型、Int型と同じデータの型
nil(何もないこと)を許容する
宣言
var num: Int?
println(num) // => nil
var str: String!
println(str) // => nil
両方ともにnilを返すので、宣言時にはnilが代入される。
var str: String? = "Hello World"
println(str) // => Optional("Hello World")
非オプショナル宣言
var str: String
println(str) // => Variable 'str' used before being initializedというエラーが発生
非オプショナル宣言、つまり普段の変数宣言では、何か値を入れないと、実行した時にエラーが発生
非OPtionalの値とOptionalの値を足し合わせる
var a: Int = 10
var b: Int? = 10
a + b // => エラーが起きる
理由:10(Int型)と10(Optional型)同士は計算出来ない
計算を行いたい場合は、Optinal型の値を通常に値に変換するために「アンラップ」を行う。
アンラップとは
コードから見てみると
var a: Int = 10 //非オプショナル型
var b: Int! = 10 //暗黙的アンラップ型
a + b // => 20
つまり、そのままでは使えないOptional型の値を、String型、Int型等として直接扱えるデータ型として変換する処理のこと。
ちなみに、変数宣言時に「!」をつけて変数を定義することを「暗黙的アンラップ型」という。
また、アンラップにはいくつかのパターンが存在する.....
1. 強制的アンラップ
2. オプショナル・バインディング
3. オプショナル・チェインニング
1. 強制的アンラップ
var optional: Int? = 10 //Optional型
println(optional) // => Optional(10)
//強制的アンラップ(!をつけて)で出力
println(optional!) // => 10
1つ注意点:
var num: Int?
num! // => Optional型の変数numはnilなので、エラー発生
これは、強制的アンラップする対象のOptional型変数の中身がnilの場合、エラーが出るため、アプリが落ちてしまう!!
そのため、中身がnilかどうか分からない場合は「オプショナル・チェインニング」か「オプショナル・バインディング」を使用
2. オプショナル・バインディング
var name: String? //オプショナル型
var name: String? = "夏目漱石"
if let unwrappedName = name {
// nameに値があれば、”夏目漱石”が代入される
println(unwrappedName) // => "夏目漱石" アンラップされて出力される
} else {
// nameがnilであれば、ここの処理が実行される
println("吾輩は猫である。名はまだないっ!!") // => "吾輩は猫である。名はまだないっ!!"
}
if let構文(varでもいい)を使って、対象となる値がnilかどうかを判別して、アンラップできる。それによって、不意にアプリが落ちることを防ぐことができる。
3. オプショナル・チェインニング
オプショナル型の変数にプロパティを取得したり、メソッドを呼び出せる。
class Human() {
let name: String = "イカ娘ちゃん"
func hello() {
println("侵略してやるでゲソ!!")
}
}
var human: Human? = Human()
// nilでないため、プロパティが取得できる
human?.name // => Optional("イカ娘ちゃん")
// nilでないため、メソッドを呼び出せる
human?.hello() // => Optional("侵略してやるでゲソ!!")
nil出ない場合、つまり、Humanクラスのプロパティ、メソッドに値や処理が書かれていない場合は、nilを返す
var human: Human?
// humanはnilなので、nilが返る
human?.name // => nil
human?.hello() // => nil
コード主体で、細かい解説はできなかったですが、参考にしていただけると幸いでございます。