Swift: Switch文のcaseの書き方について

別記事で以下のようなswitch
文を書きました。
var imageSize: CGFloat {
switch dynamicTypeSize {
case .xSmall: return 18
case .small: return 19
case .medium: return 21.5
case .large: return 22
case .xLarge: return 24.5
case .xxLarge: return 27
case .xxxLarge: return 29
case .accessibility1: return 28
case .accessibility2: return 33
case .accessibility3: return 32
case .accessibility4: return 37.5
case .accessibility5: return 42
default: return 22
}
}
このdefault
を抜くと以下のような警告が出ます。
要は「いまの時点ですべてのケースがカバーされているけど、将来増えるかも知れないよ?」という話なんでしょうが、ここにdefault
を追加してしまうと、将来増えたあとでコンパイルしたときに、それがカバーされていないにも関わらずエラーにならないという問題があるような気がします。
一方でdefault
がなければ、ケースが増えたときに何の値も返らない(それがどんなことになるのか分かりませんが)、という動きになります。
default: return 22
をなくし、switch
の外にreturn 22
を置くと、最後のreturn
には
の警告が出ます。
そもそも普通のenum
は「将来増えるかも知れないよ?」みたいなことを言われないと思うのですが、これ何か特別な仕組みがあるのかしら。
だとすると何かこういうメッセージを回避するような書き方ができそうな気もしますが。

XcodeでFixボタンを押すと@unknown default: fatalEror()
のひな形を追加してくれました。
fatalError
にするっていうのもどうなのかと思いますので、この場合は通常の.large
と同じ22を返すことにします。
これ@unknown default
にしておけば、いまはメッセージが出ませんが、ケースが増えたときに警告
が出ますね。default
だと今も、ケースが増えたときも、ともに警告は出ません。
default
を書くケースでは優先的に@unknown default
の利用を検討したほうが良い気がしてきました。

enum
の定義がプロジェクトローカルなソースコードにある場合、そのenum
は自動的に@frozen
扱いされるので、default
や@unknown default
を用意すると
の警告になります。
ライブラリとしてコンパイルする場合、@frozen
を付けていないenum
はnon-frozenになります。
そのライブラリのenum
を参照するswitch
は、default
もしくは@unknown default
がないと
の警告になります。
に色々書いてあります。
ライブラリとしてコンパイルする場合はXcodeのターゲット→Build SettingsでBUILD_LIBRARY_FOR_DISTRIBUTIONを検索し、「Build Libraries for Distribution」をNo→Yesに変えれば良さそうです(Xcode 15.4の場合)。