Swift 5で追加されたswitch文で使える@unknown default
の旨味が最初、全然分からなかったが、実例を通じて使い方と意図を掴んだ気がするので知見として広めたい。
swiftのswitch文の良さは網羅性を言語レベルで担保できる
swiftのswitch文は全てのcaseを満たすようなコードを書かないとコンパイラーエラーになり、実装漏れを気づかせてくれる優秀な言語機能だと思っています。
なのでなるべくdefault文は使わずに全てのcaseを書いておくようにしていました。
@unknown default
の良さがいまいち分からなかった
ウィジェットのサイズパターン分けで
@unknown default
を使った方が良いとの警告が出てたが、「網羅性担保できなくなるだろうがぁ」と思って全部case書いていた
将来のバージョンで追加されるって警告は出てるけれど、それはその時対応するよって思ってた
iOS15で早速追加された
.systemExtraLarget
(iPad専用)のケースが追加された。軽率にcase追加だぁとやったが、そうすると古いXcodeでコンパイル出来なくなってしまう。
特にXcodeのメジャーバージョンリリース直接などの過渡期は困る。下位互換を保ったまま対応できます。ただ、完全なる網羅性を保っているわけではないので
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でもいい