Swiftの三大データ構造であるSwift enum(列挙型)は、他の言語の列挙型と同じように連続した名前付きの定数を定義する技術です。Swift enum は構造体やクラスを定義するよりも手軽に関連したデータ構造を定義でき、その上Swiftの可読性をさらに向上させることができます。

Swift enumの書き方

要素の定義と参照の仕方を挙げ、基本的なSwift enumの書き方を示します。
・要素の定義

enum BloodType {
    case AB
    case A
    case B
    case O
}

・要素の参照

let blood0 = BloodType.AB

(変数の方が決まっている場合は省略可能です。
let blood0 = BloodType.AB→let blood1 : BloodType = .B)
※上で紹介した列挙型ですが、下のように書くことで記述を一行に省略することができます。

enum Signal {
case Blue, Yellow, Red
}

値の判定ではswitch文を使用

各要素の値を判定する際は、switch文を用いて実行します。
まず、要素の定義は次のように行います。

enum CompassPoint {
    case north
    case south
    case east
    case west
}

値の判定は次のように行います。

var directionToHead = CompassPoint.west
switch directionToHead {
case .north:
    print("Lots of planets have a north")
case .south:
    print("Watch out for penguins")
case .east:
    print("Where the sun rises")
case .west:
    print("Where the skies are blue")
}

実行結果は下記のようになります。

“Where the skies are blue”

値型 enumで値の割り当て

Swift enumの各要素に具体的な値を割り当てる際は、値型enumを使用します。
値の割り当ては次のように行います。

enum Signal: Int {
    case Blue = 1
    case Yellow = 2
    case Red = 3
}

具体的な値を取得するには次のようにrawValueプロパティを使います。

let signal0 = Signal.Blue.rawValue // 1

enumでの値の定義決め

自動的に割り振られる値を使用せず、そのenum要素が持てる値のタイプだけを定義させる場合には関連型enumを使用します。関連型enumは、付属型enumやAssociated Valuesとも呼ばれていますが、いずれの場合も書き方は次の通りです。
以下では要素の定義と各要素が取り得る値のタイプだけを定義しています。

enum Barcode {
    case UPCA(Int, Int, Int, Int)
    case QRCode(String)
}

要素が取り得る具体的な値の定義は次のように行います。

var productBarcode = Barcode.UPCA(8, 85909, 51226, 3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

関連型enumを用いて各要素の定義に具体的な値を定義することで、構造体やクラスの定義をするよりも簡単に関連するデータ構造の定義を行うことができます。

enum自身にメソッドの定義

冒頭でも紹介しましたが、enum自身もクラス同様にメソッドを持つことができます。書き方を次に示します。

enum Fruit {
    case Apple
    case Banana
    case Orange
    case Melon
    func inJapaneseName() -> String {
        switch self {
        case .Apple:
            return "りんご"
        case .Banana:
            return "バナナ"
        case .Orange:
            return "みかん"
        case .Melon:
            return "メロン"
        }
    }
}
var fruit = Fruit.Apple.inJapaneseName()
print(fruit)

実行結果は次のようになります。

“りんご”

おわりに

クラスや構造体の書き換えを行うことなく、手軽に値を指定できることがSwift enumを使用する利点となります。関連した定数をまとめる場合は、コードの可読性を高めるためSwift enumを積極的に利用しましょう。