見出し画像

今でしょ!Swift - 列挙型 - 1

列挙型は、関連する値に共通の型を定義してひとまとまりにして、見やすく間違いないコードにすることができます。

列挙型構文

enum キーワードを使用して列挙型を導入し、それらの定義全体を中括弧のペア({})内に配置します。

enum SomeEnumeration {
    // 列挙型の定義をここに記載します
}

コンパスの例示です。方向を示すキーワードが定義してあります。

enum CompassPoint {
    case north
    case south
    case east
    case west
}

case キーワードを使用して列挙型を定義します。north、south、east、west が値となります。

一行でも

enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

各列挙型の定義は、新しい型を定義します。Swift の他の型と同様に、それらの名前(CompassPoint や Planet など)は大文字で始まります。列挙型は、1 つのグループなので、複数の名前ではなく単数の名前を付けると良いです。

var directionToHead = CompassPoint.west

directionToHead の型は、CompassPoint のある値の 1 つで初期化された場合、型が推論されます。一度 directionToHead が CompassPoint として宣言されたら、次からは短いドット構文(.)を使用して別の CompassPoint 値を設定できます。

directionToHead = .east

directionToHead の型はすでにわかっているため、値を設定するときに型を省略でき、非常に読みやすいコードが作成できます。

switch 文を使った列挙値のパターンマッチング

switch 文を使って、個々の列挙値をパターンマッチングできます。

directionToHead = .south

switch directionToHead {
case .north:
    print("多くの惑星には北があります")
case .south:
    print("ペンギンに気をつけて")
case .east:
    print("太陽が登る場所")
case .west:
    print("空が青い場所")
}

// ペンギンに気をつけて

このコードは次のように読むことができます。

・directionToHead の値を選びます。
・north に等しい場合は、「多くの惑星には北があります」
・.south に等しい場合は、「ペンギンに気をつけて」

という感じで進んで、この場合は".south"が変数に入っているので".south"の「ペンギンに気をつけて」が該当します。

switch 文で全てのケースを網羅する必要があります。.west の case を省略した場合、このコードはコンパイルできません。これによって、列挙ケースが誤って省略できないようにしています。

全ての列挙ケースの case を並べることができない場合は、 default のケースを入れる必要があります。

let somePlanet = Planet.earth

switch somePlanet {
case .earth:
    print("ほとんど無害")
default:
    print("人間にとっては安全な場所ではありません")
}

// ほとんど無害


列挙ケースの繰り返し処理

一部の列挙型では、列挙型のコレクションとして処理ができるので便利です。これを有効にするには、列挙型の名前の後に 、CaseIterable を記述します。
Swift は、全てのケースのコレクションを列挙型の allCases プロパティとして提供しています。次に例を示します

enum Beverage: CaseIterable {
    case coffee, tea, juice
}

let numberOfChoices = Beverage.allCases.count
print("\(numberOfChoices) beverages available")

// 3 種類の飲み物を用意しています

上記の例では、Beverage.allCases を記述し列挙型 Beverage の全てのケースを含むコレクションにアクセスできるようにし、allCases を使っての要素にアクセスして要素の数をカウントしています。

次の例では、for ループを使用して全てのケースを繰り返し処理しています。

for beverage in Beverage.allCases {
    print(beverage)
}
// coffee
// tea
// juice



いいなと思ったら応援しよう!