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では提供されているのですが、それについてはまた別途まとめます。