【2024年4月】弊社では、基本リモートワークで一緒に成長してくださるメンバーを広く募集させていただいております。 詳細はこちら

【Swift】enum(列挙型)について徹底的に解説: Xcode 15での実装ガイド

【Swift】enum(列挙型)について徹底的に解説: Xcode 15での実装ガイド
ふくしま

りんごにスライスチーズを乗せて食べるのは一般的じゃないのですか?メモリアインクのふくしまです!
今回はSwiftに搭載された便利な機能、Enumについて解説していきますよ〜

この記事を読んでわかること…
・Enumの基礎知識
・Enumの応用的な使い方
・Enumを使うことのメリット

目次

環境

  • Xcode 15
  • Swift 5.9

enumの基礎知識

enumとは

Swiftのenum(列挙型)は、関連する値のグループを型安全に操作するための強力な機能です。これにより、コードの意図を明確にし、エラーを減らすことができます。
enumを使うと、関連する値をグループ化し、それらの値を共通の型として定義することが出来ます。
enumで定義した値や関数は、インスタンス化することでアクセスする事ができ、そのオブジェクトは値型として扱われます。

型安全とは…
プログラミング言語が型エラーを防ぐ機能や特性を指します。型安全な言語は、変数や関数が想定した型のデータのみを操作できるように制約を設け、不正な型のデータがプログラム内で混在することを防ぎます。

値型については、以下の記事で解説しています。
よければ参考にしてみてください!

enumの基本的な使い方

それでは早速、enumの基本的な使い方についてコードを交えながら解説していきます。
例として、TrafficLight(信号機)についてenumで定義していこうと思います。

// TrafficLight(信号機)のenum
enum TrafficLight {
    // 赤信号
    case red
    // 黄信号
    case yellow
    // 青信号
    case green
}

信号機には「赤信号」、「黄信号」、「青信号」といった同じ性質の値を持っていると言えます。
enumは、上記コードの2行目のように、先頭にenumをつけて定義します。
またグループ化されるそれぞれの値の定義は、4行目・6行目・8行目のように先頭にcaseをつけることで定義する事ができます。
このソースにおいてTrafficLightenumの名前で、redyellowgreenTrafficLight型の値(メンバー)です。
これで信号の色を同じ型で指定する事ができました!

enumの値を参照する場合は、「enumの名前(列挙体名).値(列挙子)」と記述します。
「信号機の赤信号」をとってきたい場合は以下のように書きます。

let currentLight = TrafficLight.red
print(currentLight)

値の参照は、1行目のTrafficLight.redの部分です。

出力結果:

red

先にenum型の変数を作成している場合は、列挙体名を省略して「.列挙子」だけで呼び出すことも可能です。

let currentLight: TrafficLight
currentLight = .yellow
print(currentLight)

1行目でTrafficLight型のcurrentLightという変数を定義しました。
この時、「黄信号」を呼び出す場合、2行目で.yellowとしていることに注目してください。

出力結果:

yellow

また、swtch文と組み合わせることで、enumの各ケースに対して独自の処理を定義することが出来ます。
これにより、コードは非常に整理され、読みやすくなります。
また、enumの全てのケースを網羅しているかコンパイラがチェックしてくれるため、漏れがあればコンパイル時にエラーとして報告されます。

先ほど定義した例(TrafficLight)を利用して、「各信号の状態に応じたアクション」の処理を定義してみましょう!

func trafficLightAction(for light: TrafficLight) {
    switch light {
    case .red:
        print("止まろう!")
    case .yellow:
        print("スピード落とそう!")
    case .green:
        print("出発!")
    }
}

この関数では、switch文を使用して、2行目のlightパラメータ(TrafficLight型)の値に基づいて異なる命令を実行しています。各caseTrafficLightの可能な値に対応しており、それぞれのシナリオに合わせたメッセージを表示します。

それでは、実行してみましょう!

let currentLight = TrafficLight.red
trafficLightAction(for: currentLight)

この例では、1行目でcurrentLight.redに設定されているため、2行目のtrafficLightAction関数の実行結果は”止まろう!”と出力されるはずです。

出力結果:

止まろう!

enumの応用的な使い方

ふくしま

さて、ここまででenumの基礎知識と基本的な使い方は理解できたかと思います。
ここからは、より応用的な実践を意識したenumの使い方について触れていきましょう!

応用その1:値関連付け (Associated Values)

enumの各ケースに値を関連付けることができます。これにより、同じenum型でも異なるケースに異なる情報を持たせることができます。

例:

例 {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

var productBarcode = Barcode.upc(8, 85909, 51226, 3)
// または
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

この例では、UPCバーコードは4つの整数の組み合わせで表され、QRコードは文字列で表されます。enumを使用すると、これらの異なるタイプのバーコードを同じBarcode型で表すことができ、関連するデータは各ケースに直接結びつけられます。

応用その2:原始値 (Raw Values)

Swiftのenumは、各ケースにデフォルト値(原始値)を設定することもできます。

例:

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

let earthsOrder = Planet.earth.rawValue // 3

この例では、Planet列挙型には整数型の原始値が設定されています。mercuryの原始値は1に設定され、それ以降のケースは自動的にインクリメントされます。earthsOrder変数は3になります。

整数型の原始値を持つenumでは、最初のケースに明示的な値を設定すると、次のケースはその値に自動的に1を加算した値になります。

enumを使うことのメリット

ふくしま

ここまでenumを学んで、結局enumを使ったらどんな良い事が起きるの?
ここからは、enumを使うことのメリットを”列挙”したいと思います!

1.型安全性

冒頭でも少し触れた通り、enumは型安全です。
つまり、enumの値は明示的に定義されたケースのいずれかでなければならず、それ以外の値を取ることはできません。
これにより、不正な値や予期しない値によるバグを防ぐことができます。

2.コードの意図が明確

enumを使用すると、コードの意図が明確になります。
特定の状態やカテゴリを表すenumを使用すると、それらの状態やカテゴリがコードの中で明確に区別され、理解しやすくなります。

3.エラーハンドリングが見やすくなる

enumはエラーハンドリングに非常に便利です。
enumを使用してエラーの種類を表すと、エラーをより簡単に分類し、対応する処理を行うことができます。

4.コードの保守性と拡張性の向上

enumを使用すると、コードの保守性と拡張性が向上します。
新しいケースをenumに追加することは、関連するコードの変更を最小限に抑えながら、新しい機能やオプションをシステムに追加する簡単な方法です。

まとめ

enumを正しく使うことで、コードの可読性、保守性を向上することが出来ます。
この記事をよく読んで、実践でも正しく楽しくenumを利用できるようになりましょう!
この記事が皆様の開発ライフの一助になれれば幸いです!

ふくしま

この記事があなたのスキルアップに役立ったなら、次のキャリアステップを踏み出す絶好の機会かもしれません。エンジニアとしてのさらなる成長と挑戦を求めるなら、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
をオススメします!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメント一覧 (1件)

コメントする

目次