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(列挙型)についてご説明しました。

© 2024 iOS 開発入門