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で定義することで予期しないデータが入らないようにすることもできますので、ぜひ活用してみて下さい。
次は「プロトコル」についてご紹介します。
この記事が気に入ったらサポートをしてみませんか?