Xcode 10.2
がリリースされてからSwift 5
に移行した方も多いと思います。
enum
のcaseで分岐するSwitch文
を書いたとき、
以下のようにHandle unknown values using "@unknown default"
と
警告が出る
ときと出ない
ときがありました。
この違いは何なのか調査しました。
Frozen enumとnon-frozen enum
・frozen enum
を使ったときは警告が出ない。
・non-frozen enum
を使うと@unknown default
を使いなさいと警告が出る。
non-frozen enum
とは、
Objective-C
で記述されたenum
でNS_ENUM
で定義されています。
将来case
が追加される可能性があることを示しています。
| 言語 | Objective-C | Objective-C | Swift |
|:--:|:--:|:--:|:--:|:--:|
| 定義 | NS_ENUM | NS_CLOSED_ENUM |enum |
| Frozen | No | Yes | Yes |
| @unknown default:
| 必要 | 不要 | 不要 |
@unknown default:
には何を書くのが正解?
警告が出たときにFIX
を押すと以下のコードが追加されるます。
乱暴かもしれませんが、変な状態でアプリが動作するよりは
fatalError()
でクラッシュするのが正解なのだと思います。
余談ですが
-
@unknown default:
って「余計なお世話」感が強い。
警告が出ないオプションが欲しいところ。 -
@unknown default:
って書き方がなんかダサい。
もっとスマートな書き方は思いつかなかったのか?
switch!
(unknown caseでクラッシュ)とか。
switch?
(unknown caseを無視)とか。 -
Swift
でnon-frozen enum
が書けないってことは、
当面Apple製Framework(UIKitとか)はObjective-C
で開発するって事なんでしょうね。