前提環境
- Xcode 10.1
- Swift 4.2
Swiftのenumは、protocolに準拠させることで、いろいろな振る舞いを与えることができます。
これは実務では強力な機能であり、ちょっとした工夫によってコードをシンプルにできたりします。
例えば以下のようなことができます。
- Comparableに準拠することで、比較演算子を定義したり
- CaseIterableに準拠することで、allCases プロパティを通して全ての値をコレクションとして取得できたり
コードサンプルで表現するとこんな感じです。
Playground
import Foundation
/// Tシャツサイズ
enum TshirtSize: String, Comparable, CaseIterable {
case xs = "XS"
case s = "S"
case m = "M"
case l = "L"
case xl = "XL"
case xxl = "XXL"
// Comparableに準拠すると、この関数を定義しなければならない(定義することで大小比較が可能になる)
static func < (lhs: TshirtSize, rhs: TshirtSize) -> Bool {
return lhs.order < rhs.order
}
var order: Int {
// CaseIterableに準拠すると、allCasesで全caseの配列を取得できる
return TshirtSize.allCases.firstIndex(of: self) ?? 0
}
}
let m = TshirtSize.m
let l = TshirtSize.l
let xl = TshirtSize.xl
print("\(m < l)") // true
print("\(l <= xl)") // true
print("\(m > xl)") // false