【swift】nilとoptionalな型の取り扱い
nilの扱い
swiftでは通常、変数や定数にnilは代入できません。
var hoge: String = nil let fuga: String = nil
これはコンパイルエラーになります。
nilを代入するためには、optionalであることを宣言するために型に?をつけます。
var hoge: String? = nil let fuga: String? // 代入しなくても初期値はnil
メソッドなどを使用する際
変数や定数をoptionalな型として宣言するということは、
「必ずしも値が入っているとは限らない(nilである可能性がある)」
ということです。
その状態でメソッドを叩こうとすれば、当然nilだった場合は実行できません。
let str: String? str.uppercaseString // strはnilの可能性があるのでコンパイルエラーになる
コンパイルエラーにならないようにするためには、変数や定数の後ろに!をつけるとコンパイルできるようになります。
let str: String? str!.uppercaseString // コンパイルは通るようになるが実行時にエラーになる
ただ、このケースだとコンパイルは通りますが、strはあくまでもnilなので実行時にエラーになります。
この場合strがnilでないことを事前にチェックする必要があります。
let str: String?
if str != nil {
str!.uppercaseString // strがnilではないのでメソッドを実行することができる
}
この辺りの記述をもっとスマートに書くために、Optional BindingやOptional Chainingなどの記法がswiftでは提供されているのですが、それについてはまた別途まとめます。