[Swift] Optionals またはSwiftの?と!について
SwiftにおいてOptionalsとは、値にnilを許す変数のことを指します (通常の変数はnilを許さない)。 Swiftでは?や!を用いてOptionalsに関する操作を行います。
型に対する操作
型の後に何も付けない
通常の変数 (値にnilを許さない)。
var label: String = "123"
var label: String = nil // compile error
型の後に?
optional変数となる。
通常の変数であることが期待される箇所ではコンパイルエラーとなる。
var label: String? = nil
label.toInt() // コンパイルエラー
変数に!を付ければ通常の変数と同様に扱えるが、値がnilだと値が展開できずに実行時エラーとなる恐れがある。
var label: String? = nil
label!.toInt() // コンパイルは通るが実行時エラーとなる
型の後に!
optional変数となるが、通常の変数として扱われる。
値がnilであってもコンパイルは通るが、値が展開できずに実行時エラーとなる恐れがある。
var label: String! = nil
label.toInt() // コンパイルは通るが実行時エラーとなる
変数に対する操作
変数の後に何も付けない
通常の変数なら通常の変数、optional変数ならoptional変数として扱われる。 よってoptional変数を通常の変数として扱いたい場合、?や!を用いた操作を行う必要がある。
変数の後に?
通常の変数の場合、この記述法はできずコンパイルエラーとなる。
optional変数の場合、値がnil以外ならその値が展開される。
var label: String? = "123"
label?.toInt() // -> 123
var label: String? = nil
label?.toInt() // -> nil
変数の後に!
通常の変数の場合、この記述法はできずコンパイルエラーとなる。
optional変数の場合、値が強制的に展開される。
var label: String? = "123"
label!.toInt() // -> 123
値がnilの場合、展開できずに実行時エラーとなる。
var label: String? = nil
label!.toInt() // コンパイルは通るが実行時エラーとなる