Swift の enum(列挙型)
ここでは Swift の enum(列挙型)についてご説明します。
Swift の enum(列挙型)とは?
Swift の enum(列挙型)は、関係する複数の値をまとめてグループ化したようなものです。
コードを書く時に、変数に保持したり、引数で渡したりする値の候補が限られている時などにも、String 型にしてなんでも扱えるようにしておくよりも、enum を定義して、その enum の型を指定しておくことで、コードがわかりやすく、間違いも少なくなります。
例えば、move() という関数に up, down, left, right のどれかを引数として受け取って処理をしたいとします。
その時、引数を String 型にして受け取ることも可能ですが、そうすると呼び出し側で間違えて "rigth" を渡してもエラーにならず気がつかない、なんてことになるかもしれません。
そういう時に enum を定義して、それを引数のデータ型として指定しておけば、わかりやすいコードになり、不具合も少なくなります。
Swift の enum を定義する
Swift の enum(列挙型)を定義するには enum と case というキーワードを使って次のようにします。
enum [enum 名] {
case [enum 値1]
case [enum 値2]
case [enum 値3]
}
C 言語や Objective-C などと違って、Swift ではデフォルトで enum 値に整数の値は割当られません。
例えば、例にあげた move() という関数に渡す enum を Direction という名前で定義すると次のようになります。
enum Direction {
case up
case down
case left
case right
}
次のように 1 行で定義しても同じ意味になります。
enum Direction {
case up, down, left, right
}
enum 値をアサインしたり、比較したりする際は [enum 名].[enum 値] か、型が決まっている場合は [enum 名]は省略して、.[enum 値] のように指定できます。
var d = Direction.right
d = .left
Swift の enum を switch 文で使う
Swift の enum(列挙型)は、よく switch 文と一緒に使われます。
例えば、d という Direction enum 型の変数を定義して、switch 文でその enum 値によって違う文字列を print するには次のようにできます。
enum Direction {
case up
case down
case left
case right
}
let d = Direction.right
switch d {
case .up:
print("Direction is up")
case .down:
print("Direction is down")
case .left:
print("Direction is left")
case .right:
print("Direction is right")
}
実行結果は次のようになります。
Direction is right
Swift の enum を引数として渡す
Swift の enum(列挙型)を引数として渡したい時は、引数のデータ型を指定する箇所で enum 名を指定します。
例えば、先ほどの switch 文を move() という名前の関数にして、Direction を引数として渡したい時は次のようにできます。
enum Direction {
case up
case down
case left
case right
}
func move(direction: Direction) {
switch direction {
case .up:
print("Direction is up")
case .down:
print("Direction is down")
case .left:
print("Direction is left")
case .right:
print("Direction is right")
}
}
move(direction: .down)
実行結果は次のようになります。
Direction is down
Swift の enum を Associated Values を指定して使う
Swift の enum では associated value という関連する値を保持するように定義して使うことができます。
例えば、先ほどの Direction という enum の値に Int でどれくらい進むかという associated value を持たせたい時には次のようにできます。
switch 文では、case .[enum 値](let 定数名) のようにして、関連する値を定数に代入して使うことができます。
enum Direction {
case up(Int)
case down(Int)
case left(Int)
case right(Int)
}
let direction = Direction.down(2)
switch direction {
case .up(let i):
print("Direction is up - \(i)")
case .down(let i):
print("Direction is down - \(i)")
case .left(let i):
print("Direction is left - \(i)")
case .right(let i):
print("Direction is right - \(i)")
}
実行結果は次のようになります。
Direction is down - 2
今回は、全ての enum 値に Int 型の associated value をひとつずつ持たせるようにしましたが、複数でもかまいませんし、データ型は enum 値ごとに違っても大丈夫です。
Swift の enum を Raw Values を指定して使う
定義の箇所でも言いましたが、Swift の enum では、C 言語や Objective-C などと違って、デフォルトで enum 値に整数の値は割当られません。
各 enum 値に Int や String などの値を割り当てたい時は、raw value を指定することによって可能です。
定義する際に [enum 名]: データ型 のように指定して、case [enum 値] = [row value] のように値を指定します。
そして、使うと時は [enum 値].rawValue のようにして、その値を取得できます。
enum Direction1: Int {
case up = 0
case down
case left
case right
}
let d1 = Direction1.left
print(d1.rawValue)
enum Direction2: String {
case up = "UP"
case down = "DOWN"
case left = "LEFT"
case right = "RIGHT"
}
let d2 = Direction2.left
print(d2.rawValue)
実行結果は次のようになります。
2
LEFT
以上、Swift の enum(列挙型)についてご説明しました。