LoginSignup
13
16

More than 3 years have passed since last update.

enum はなぜ便利なのか

Last updated at Posted at 2019-03-31

mySignals.gif

ネットの enum 解説を読んでもピンとこない方のために書きました。

enum の読み方

enum (列挙型)の読み方は諸説ありますが「イーナム」が多数派のようです。
enum の語源は enumerate [ɪnjúːmərèɪt](イニューマレイト:数え上げる)ですが、youtube を見ると英語圏でも「イーナム」と発音する人が多いです。
HowToPronounceEnum.gif

どんな時に使うか

enum は「3つ以上の選択肢があるフラグ」を表現する時に使います。
swift で使われている enum を「Jump to Definition」で探ってみると、


public enum NSTextAlignment : Int {
    case left
    case center
    case right
 }

とか

extension UIAlertAction {
    @available(iOS 8.0, *)
    public enum Style : Int {
        case `default`
        case cancel
        case destructive
    }
}

のように定義されています。

BOOL はなぜ便利なのか

enum について説明する前に、BOOL がなぜ便利なのかを考えてみました。
BOOL は「真か偽か」の二値を表す時に使います。
私が35年前に使っていたMicrosoft BASIC には BOOL がありませんでした。(・・・と思います。記憶が間違っていたらすみません。)
その当時は真か偽かのフラグは「真を1、偽を0」の数値にしたり「YとN」の文字にしていました。しかしこの方法は間違いの元です。0か1かどちらが真なのか間違ったり、0と1以外の値も代入できてしまいます。真を表すのが「Y」なのか「YES」なのか「yes」 なのか間違うこともあり、それらを誤って代入してもエラーメッセージがでません。
その点、BOOL を使えば、真は常に true で、偽は常に false (swift では) なので間違うことがありません。BOOL 型の変数に true/false 以外の値を代入することはできません。真・偽のフラグは Int 型や String 型よりも BOOL 型の方が可読性がよくバグも起こりにくいです。

3個以上の選択肢を持つフラグに enum を使う

真・偽のフラグには BOOL を使いますが、上述のように「left, center, right」などの選択肢が3個以上あるフラグを表現する時に enum は便利です。
これらのフラグを1, 2, 3 などの Int 型(マジックナンバー)にすると、わけがわからなくなります。
"left" "center" "right" などの String 型にすると単語のスペルを間違うことがあり、間違ったままでもコンパイルは通ってしまいます。

Xcode の予測候補機能

Xcode には便利な予測候補機能があります。
以下のように .blue .red .yellow を持つ enum (Signal) があり、mySignal をインスタンスとします。
mySignal = . と打ち込むと、blue, red, yellow と予測候補が出てきます。mySignal に、.blue .red .yellow 以外の値が代入されることはありません。switch, case でも同様に予測候補を示してくれます。
enum.gif

おわりに

以上に示したように「3個以上の選択肢があるフラグ」に enum を使うことによって安全性や可読性が向上します。swift の enum には更に強力な機能があるそうですが、私のスキルでは使いこなせないので割愛させていただきます。

enum は MECE である

も参考にしてください。

13
16
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
13
16