Swiftのはなしです。
Swiftは言語標準でOptionalが入っていて、Optionalを除く全てのデータ型はnil
を表現できません。
その中で、特殊なOptionalとして、Implicitly Unwrapped Optionalと呼ばれるものがあります。
これは、勝手にunwrapしてくれるので普通のデータ型と同じようにアクセスできるけど、中身がnilだったらunwrapに失敗するので死ぬという、特殊なOptionalです。
つまり、こいつを使うと、Optionalがせっかく解決してくれているはずの「ぬるぽリスク」が再び我々の目の前に現れることになり、つらい思いをすることになります。
どうしても使わなければならない場面でなければ、普通のOptionalを利用するべきです。
しかし、アクセスするタイミングでは「絶対に」nil
にならないんだけど、一時的にnil
になり得る場合がある。といったケースもあると思います。
具体的にはUIViewController
のdidViewLoaded
で初期化するケースなどです。
そういったケースでは、(無理やりnil
を代入して初期化するといったことをしていない限り、)Implicitly Unwrapped Optional による「ぬるぽリスク」も少ないのである程度安心して利用できます。
- どうしても
nil
の代入は裂けられないのか? - どうしても初期化で
nil
以外の値を入れることはできないのか?- せめて、初期化のタイミングで
nil
以外の値がくることを保証できないか? - e.g.) NG:
let timeZone: NSTimeZone! = NSTimeZone(name: "Asia/Tokyo")
- e.g.) OK:
let timeZone: NSTimeZone? = NSTimeZone(name: "Asia/Tokyo")
- e.g.) OK:
let timeZone: NSTimeZone = NSTimeZone(name: "Asia/Tokyo")!
- せめて、初期化のタイミングで
nil
のタイミングでは絶対にアクセスしないか?
というあたりにすべてYES
と答えられない限り、Implicitly Unwrapped Optionalは使うべきでないです。
やすやすと手をだすと忘れた頃に痛い目を見ることになるでしょう。
現場からは以上です。