enum はなぜ便利なのか


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

enum の読み方

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

どんな時に使うか

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 でも同様に予測候補を示してくれます。

おわりに

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

enum は MECE である

も参考にしてください。