今でしょ!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