【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なので実行時にエラーになります。

この場合strnilでないことを事前にチェックする必要があります。

let str: String?
if str != nil {
  str!.uppercaseString // strがnilではないのでメソッドを実行することができる
}

この辺りの記述をもっとスマートに書くために、Optional BindingやOptional Chainingなどの記法がswiftでは提供されているのですが、それについてはまた別途まとめます。