時計を壊せ

駆け出してからそこそこ経ったWebプログラマーの雑記

Implicitly Unwrapped Optionalは基本的に使うべきではない

Swiftのはなしです。

Swiftは言語標準でOptionalが入っていて、Optionalを除く全てのデータ型はnilを表現できません。 その中で、特殊なOptionalとして、Implicitly Unwrapped Optionalと呼ばれるものがあります。 これは、勝手にunwrapしてくれるので普通のデータ型と同じようにアクセスできるけど、中身がnilだったらunwrapに失敗するので死ぬという、特殊なOptionalです。 つまり、こいつを使うと、Optionalがせっかく解決してくれているはずの「ぬるぽリスク」が再び我々の目の前に現れることになり、つらい思いをすることになります。 どうしても使わなければならない場面でなければ、普通のOptionalを利用するべきです。

しかし、アクセスするタイミングでは「絶対に」nil にならないんだけど、一時的にnilになり得る場合がある。といったケースもあると思います。 具体的にはUIViewControllerdidViewLoadedで初期化するケースなどです。 そういったケースでは、(無理やり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は使うべきでないです。 やすやすと手をだすと忘れた頃に痛い目を見ることになるでしょう。

現場からは以上です。