【Swift/SwiftUI】列挙型の定義と使用方法

本記事ではSwiftで使用可能な列挙型というデータ構造の基本的な定義方法と使用方法について解説していきます。

列挙型とは

列挙型とは、複数の決まった選択肢の中から1つを選ぶための値などを扱うためのデータ型です。

例として、年月(1月~12月)や曜日(月曜日~日曜日)、独自のエラー定義などの選択肢として決まった値を定義してその中から1つを選択して分岐処理を行いたい時などに使うことができます。

列挙型の中には、「case メンバ名」という形で複数の要素を定義することができ、これらの要素をメンバと呼びます。

メンバは値を割り振って区別することができ、割り振ることができるデータ型は整数値、浮動小数点数値、文字列のみに限定されています。

列挙型の定義

列挙型の定義はまず、列挙型名の前に列挙型の宣言を意味するenumerationを意味する予約語のenumをつけて構造体のように{}を用意していきます。列挙型名は大文字開始のキャメルケースで記述します。

列挙型内ではcaseという予約語を使用して各メンバを入れていきます。以下の例では、OSを意味する列挙型を定義し、メンバには各OSの種類を意味する値を用意しています。

enum OperatingSystem {
    case mac
    case windows
    case chrome
    case linux
}

各メンバは小文字始まりのキャメルケースで記述します。

上で定義したこれらのメンバは実際に使用する際にはmacであれば、「OperatingSystem.mac」といった値になりますが、それぞれのメンバを区別しやすくするためにそれぞれに値を割り当てて使用することができます。

割り当てる値のことを実体と呼び、実体をcaseに割り当てる際には列挙型宣言時に実体のデータ型を宣言します。

enum OperatingSystem :Int {
    case mac = 0
    case windows = 1
    case chrome = 2
    case linux = 3
}

割り当てる実体は、全てのメンバで同じデータ型である必要があり、重複した値を割り当てることもできません

列挙型の使用

列挙型のデータを実際に使用する場合には、「列挙型データ名.メンバ名」というフォーマットで呼び出します。

実体を割り振らなかった場合、列挙型データ名.メンバ名というフォーマットでデータを取得します。

取得したデータはそのまま「列挙型データ名.メンバ名」というデータになります。

また、使用するメンバがどの列挙型のデータであるかが明確な場合には列挙型名を省略して「.メンバ名」というフォーマットで記述することもできます。

enum OperatingSystem {
    case mac
    case windows
    case chrome
    case linux
}
//列挙型のメンバの代入
var selectOS = OperatingSystem.mac
//列挙型メンバ
var selectedOS: OperatingSystem = .windows

実体を割り振った場合にもメンバの取得方法は、値は割り振らなかった場合と同様になりますが、rawValueを使用することで実体データを参照することができます。

rawValueの値は、メンバへの値の代入時に宣言したデータ型で取得されるため、以下の例ではInt型の値が取得できます。

enum OperatingSystem :Int {
    case mac = 0
    case windows = 1
    case chrome = 2
    case linux = 3
}
var selectedOS: OperatingSystem = .windows
print(selectedOS.rawValue)
//実行結果:1

列挙型のデータはswitch文で使用される場面が多く、それぞれのメンバの選択状況に合わせて異なる処理を行いたい場面で有効に使用できます。

enum OperatingSystem :Int {
    case mac = 0
    case windows = 1
    case chrome = 2
    case linux = 3
}

var selectOS = OperatingSystem.mac

switch selectOS {
case .mac:
    print("Macです")
case .windows:
    print("Windowsです")
case .chrome:
    print("ChromeOSです")
case .linux:
    print("Linuxです")
}

最後に

本記事では、Swiftの列挙型データについて解説してきました。

  • 列挙型データは予約後enumを用いて宣言し、メンバを内包する
  • 各メンバは「列挙型名.メンバ名」で参照可能
  • メンバには実体という値を設定することができる

他にも辞書データで使用可能なメソッド、プロパティについて紹介する記事も書いていますのでそちらもご確認ください。