MD Blog

誰かの何かに役に立てることを書いていきたいです

[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

値がnilの場合、式全体がnilとなる。

var label: String? = nil
label?.toInt() // -> nil

変数の後に!

通常の変数の場合、この記述法はできずコンパイルエラーとなる。

optional変数の場合、値が強制的に展開される。

var label: String? = "123"
label!.toInt() // -> 123

値がnilの場合、展開できずに実行時エラーとなる。

var label: String? = nil
label!.toInt() // コンパイルは通るが実行時エラーとなる

Reference

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_399