enum使っていますか?
Swiftの列挙型は単なる整数型の集合ではなく、型を指定したり独自のメソッドを定義できたりと便利なものになっています。
メソッドを定義
Swiftの列挙型にはメソッドを定義することができます。
enum Direction {
case up, down, right, left
func reverse() -> Direction {
switch self {
case .up:
return .down
case .down:
return .up
case .right:
return .left
case .left:
return .right
}
}
}
let up = Direction.up
up.reverse() // down
let right = Direction.right
right.reverse() // left
独自イニシャライザ
rawValueによる初期化だけでなく独自のイニシャライザを定義できます。
enum Animal {
case dog, cat
init?(name: String) {
switch name {
case "犬":
self = .dog
case "猫":
self = .cat
default:
return nil
}
}
}
let dog = Animal(name: "犬") // dog
let hoge = Animal(name: "hoge") // nil
共用型の列挙型
シンプルな列挙型と、複数の異なるタプルの構造を併せ持つことができる列挙型を共用型の列挙型と言います。
下記の例では、"custom"に文字列型を付加しています。
enum Message {
case foo
case bar
case custom(String)
func string() -> String {
switch self {
case .foo:
return "foo"
case .bar:
return "bar"
case .custom(let s):
return s
}
}
}
let foo = Message.foo
foo.string() // foo
let custom = Message.custom("hoge")
custom.string() // hoge
なお、共用型の列挙型では==演算子を独自に定義しないと値の比較ができません。
以下サンプルです。
static func ==(v1: Message, v2: Message) -> Bool {
switch (v1, v2) {
case (.foo, .foo):
return true
case (.bar, .bar):
return true
case (.custom(let s1), .custom(let s2)):
return s1 == s2
default:
return false
}
}
Message.custom("aaa") == Message.custom("bbb") // false
Message.custom("aaa") == Message.custom("aaa") // true