LoginSignup
6
5

More than 1 year has passed since last update.

Swiftの@unknown defaultを理解する

Posted at

Swift 5で追加されたswitch文で使える@unknown defaultの旨味が最初、全然分からなかったが、実例を通じて使い方と意図を掴んだ気がするので知見として広めたい。

swiftのswitch文の良さは網羅性を言語レベルで担保できる

swiftのswitch文は全てのcaseを満たすようなコードを書かないとコンパイラーエラーになり、実装漏れを気づかせてくれる優秀な言語機能だと思っています。
なのでなるべくdefault文は使わずに全てのcaseを書いておくようにしていました。

@unknown defaultの良さがいまいち分からなかった

  • ウィジェットのサイズパターン分けで@unknown defaultを使った方が良いとの警告が出てたが、「網羅性担保できなくなるだろうがぁ:triumph:」と思って全部case書いていた
    スクリーンショット 2021-09-28 17.39.19.png

  • 将来のバージョンで追加されるって警告は出てるけれど、それはその時対応するよって思ってた

iOS15で早速追加された

  • .systemExtraLarget(iPad専用)のケースが追加された。

  • 軽率にcase追加だぁとやったが、そうすると古いXcodeでコンパイル出来なくなってしまう。
    特にXcodeのメジャーバージョンリリース直接などの過渡期は困る。

  • そこで@unkonwn defaultの出番
    スクリーンショット 2021-09-28 17.40.13.png

  • 下位互換を保ったまま対応できます。ただ、完全なる網羅性を保っているわけではないのでSwitch must be exhaustiveの警告が残り続けてくれる。
    これは人やプロジェクトによって好みが分かれるかもしれません。警告が把握しきれていないほど出ている場合は見落としてしまう気がしますので、プロジェクト内で決まりごとを決めておいた方が良さそうです。

@unknown defaultを使うか否かの線引

主にenumの管理者によって変わると思っています。

自分たちで管理しているenumのswitch文

  • 全てcase文を書いて実装漏れを防ぐのが基本
  • caseを追加しているという事は意図が明確でまさにunknownなcaseではないはずだから

自分たちの管理外のenum(3rd Party製ライブラリやApple公式ライブラリ etc...)

  • swiftのアトリビュートに@frozenが付いていないもの(つまり将来case追加予定があるenum)
  • 未知の値にどういった処置をとるか明確は場合に@unknown defaultを使用
  • ホントの意味のデフォルトの挙動ならdefaultでもいい
6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5