Swift 文法その8 - Enum

Enum は定数をまとめて定義するためのデータ型です。たとえばサイズを定義する場合は以下のように記述します。

enum Size {
    case S, M, L
}

// または
enum Size {
    case S
    case M
    case L
}

これをそのままデータ型として使用することができるので、クラスなどで変数宣言する場合は以下のようになります。

var size: Size = Size.S

// もしくは型推論で
var size: Size = .S

値のデータ型を定義する

以下のように各データの型を定義したり、 = 〇〇 で固有の値をセットすることもできます。値を参照する時は rawValue プロパティを使用します。

enum Size: String {
    case S, M, L
}

var size = Size.S
print(size.rawValue) // "S"

enum Size: String {
    case S = "Sサイズ"
    case M = "Mサイズ"
    case L = "Lサイズ"
}

var size = Size.S
print(size.rawValue) // "Sサイズ"

また、データ型を Int で定義した場合、上の case から自動的に「0, 1, 2 ...」というように連番が割り当てられます。また、最初の case に数字をセットすると、その後の case の値は自動的にその次の連番の数字が割り当てられます。

enum Size: Int {
    case S = 2, M, L
}

var size = Size.L
print(size.rawValue) // 4

Enum のイニシャライザに rawValue を渡すと Enum で定義したデータを求めることもできます。

let size = Size(rawValue: 2)
print(size) // Size.S

変数・関数を定義する

Enum はクラスのように変数と関数を定義することができます。

enum Size: Int {
    case S, M, L
    
    var price: Int {
        switch self {
            case .S: return 100
            case .M: return 200
            case .L: return 300
        }
    }
    
    func sizeToString() -> String {
        switch self {
        case .S: return "Sサイズ"
        case .M: return "Mサイズ"
        case .L: return "Lサイズ"
        }
    }
}

var size = Size.S
print(size.price) // 100
print(size.sizeToString()) // "Sサイズ"​

コンストラクタを定義する

init メソッド(nilになる場合は init? メソッド)によってコンストラクタを定義することができます。

enum Size {
   case S, M, L
   
   init?(price: Int) {
        if price == 100 {
            self = .S
        } else if price == 200 {
            self = .M
        } else if price == 300 {
            self = .L
        } else {
            return nil
        }
    }
}

print(Size(price: 100)) // Size.S

case の値を初期化時に設定する

あらかじめ値を定義するのではなく、Enum を初期化する時に値を設定することもできます。渡された値は変数や関数で以下のようにして参照できます。

enum Size {
    case S
    case M
    case L
    case other(price: Int)
    
    var price: Int {
        switch self {
            case .S: return 100
            case .M: return 200
            case .L: return 300
            case .other(let price): return price
        }
    }
}

let size = Size.other(price: 500)
print(size.price) // 500

CaseIterable

enum に CaseIterable プロトコルを実装すると、すべての case を allCases メソッドにより配列で取得することができます。

enum Size: CaseIterable {
   case S, M, L
}

print(Size.allCases) // [Size.S, Size.M, Size.L]


おさらい

Enum の使い所はさまざまで、たとえばモデルのとあるプロパティにセットされる値が複数パターンあって、その数が決まっている場合にそのプロパティを Enum で定義したり、ビュー側で UITableView の各セクションや各行に表示する情報の定義に使ったりします。Enumで定義することで予期しないデータが入らないようにすることもできますので、ぜひ活用してみて下さい。

次は「プロトコル」についてご紹介します。

この記事が気に入ったらサポートをしてみませんか?