LoginSignup
14
9

More than 5 years have passed since last update.

[Swift] Handle unknown values using "@unknown default" がわかった件

Last updated at Posted at 2019-04-11

Xcode 10.2がリリースされてからSwift 5に移行した方も多いと思います。
enumのcaseで分岐するSwitch文を書いたとき、
以下のようにHandle unknown values using "@unknown default"
警告が出るときと出ないときがありました。
SS2019-04-11-20.14.01.png
この違いは何なのか調査しました。

警告出る
SS2019-04-12-6.20.02.png
警告出ない
SS 2019-04-12-6.23.34.png

Frozen enumとnon-frozen enum

frozen enumを使ったときは警告が出ない。
non-frozen enumを使うと@unknown defaultを使いなさいと警告が出る。

non-frozen enumとは、
Objective-Cで記述されたenumNS_ENUMで定義されています。
将来caseが追加される可能性があることを示しています。

言語 Objective-C Objective-C Swift
定義 NS_ENUM NS_CLOSED_ENUM enum
Frozen No Yes Yes
@unknown default: 必要 不要 不要

@unknown default:には何を書くのが正解?

警告が出たときにFIXを押すと以下のコードが追加されるます。
SS2019-04-11-20.13.38.png
乱暴かもしれませんが、変な状態でアプリが動作するよりは
fatalError()でクラッシュするのが正解なのだと思います。

余談ですが

  1. @unknown default:って「余計なお世話」感が強い。
    警告が出ないオプションが欲しいところ。
  2. @unknown default:って書き方がなんかダサい。
    もっとスマートな書き方は思いつかなかったのか?
    switch!(unknown caseでクラッシュ)とか。
    switch?(unknown caseを無視)とか。
  3. Swiftnon-frozen enumが書けないってことは、
    当面Apple製Framework(UIKitとか)はObjective-Cで開発するって事なんでしょうね。
14
9
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
14
9