列挙型

宣言

列挙型は、関連する値を型としてまとめたものです。例えば、次のように信号機の状態をまとめることができます。


// 信号機
enum Signal {
    case Blue       // 青
    case Yellow     // 黄   
    case Red        // 赤
}

var s: Signal
s = Signal.Blue
s = .Blue   // 型(Signal)は省略できる。

列挙型の型名とメンバ名の最初の文字は大文字にすることが推奨されています。

各メンバは次のように1行で書く事もできます。


enum Signal {
    case Blue, Yellow, Red
}

列挙型の内部表現の型を次の様に明示的に指定することもできます。


enum Signal: Int {
    case Blue
    case Yellow
    case Red
}
let s = Signal.Yellow
// toRawメソッドで実際の値を参照可能
print(s.toRaw())  // 1
// fromRawメソッドで値を設定可能
let signal = Signal.fromRaw(2)  // Signal.Red

上で使っているfromRawメソッドはSignal型に無い値を渡した場合は、nilが返ります。つまり返り値はオプショナル型になります。上の場合は、signal: Signal? = Signal.fromRaw(2) と書くのと同義です。

また、それぞれの値を必要に応じて指定することもできます。


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

// 整数型以外の場合は全ての値を明示する必要がある。 
enum Signal: String {
    case Blue = "青"
    case Yellow = "黄"
    case Red = "赤"
}

列挙型にメソッドを定義することもできます。


enum Signal {
    case Blue
    case Yellow
    case Red
    func meaning() -> String {
        switch(self) {
        case .Blue:
            return "進め"
        case .Yellow:
            return "注意"
        case .Red:
            return "止れ"
        }
    }
}

let s = Signal.Yellow
print(s.meaning())    // 注意

関連値

Swiftの列挙型は、値を列挙する他に、別の型を使って表現することもできます。


/* 乗り物 */
enum Vehicle {
    case Bicycle         // 自転車
    case Motorbike(Int)  // バイク(排気量)
    case Car(Int, Bool)  // 車(排気量, オートマ)
}

var vehicle = Vehicle.Bicycle
vehicle = .Motorbike(750)
vehicle = .Car(1600, true)

switch vehicle {
case .Bicycle:
    print("自転車")
case .Motorbike(let engine) where engine <= 50:
    print("オートバイ:原付")
case .Motorbike(let engine) where engine <= 125:
    print("オートバイ:小型")
case .Motorbike(let engine) where engine <= 400:
    print("オートバイ:中型")
case .Motorbike(let engine):
    print("オートバイ:大型")
case .Car(let engine, let automatic) where engine <= 660:
    print("軽自動車:" + (automatic ? "オートマ" : "マニュアル"))
case .Car(let engine, let automatic):
    print("普通車 \(engine)cc:" + (automatic ? "オートマ" : "マニュアル"))
}