りんごにスライスチーズを乗せて食べるのは一般的じゃないのですか?メモリアインクのふくしまです!
今回は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
をつけることで定義する事ができます。
このソースにおいてTrafficLight
はenumの名前で、red
yellow
green
はTrafficLight型の値(メンバー)です。
これで信号の色を同じ型で指定する事ができました!
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型)の値に基づいて異なる命令を実行しています。各case
はTrafficLight
の可能な値に対応しており、それぞれのシナリオに合わせたメッセージを表示します。
それでは、実行してみましょう!
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を使うことのメリット
ここまでenumを学んで、結局enumを使ったらどんな良い事が起きるの?
ここからは、enumを使うことのメリットを”列挙”したいと思います!
1.型安全性
冒頭でも少し触れた通り、enumは型安全です。
つまり、enumの値は明示的に定義されたケースのいずれかでなければならず、それ以外の値を取ることはできません。
これにより、不正な値や予期しない値によるバグを防ぐことができます。
2.コードの意図が明確
enumを使用すると、コードの意図が明確になります。
特定の状態やカテゴリを表すenumを使用すると、それらの状態やカテゴリがコードの中で明確に区別され、理解しやすくなります。
3.エラーハンドリングが見やすくなる
enumはエラーハンドリングに非常に便利です。
enumを使用してエラーの種類を表すと、エラーをより簡単に分類し、対応する処理を行うことができます。
4.コードの保守性と拡張性の向上
enumを使用すると、コードの保守性と拡張性が向上します。
新しいケースをenumに追加することは、関連するコードの変更を最小限に抑えながら、新しい機能やオプションをシステムに追加する簡単な方法です。
まとめ
enumを正しく使うことで、コードの可読性、保守性を向上することが出来ます。
この記事をよく読んで、実践でも正しく楽しくenumを利用できるようになりましょう!
この記事が皆様の開発ライフの一助になれれば幸いです!
この記事があなたのスキルアップに役立ったなら、次のキャリアステップを踏み出す絶好の機会かもしれません。エンジニアとしてのさらなる成長と挑戦を求めるなら、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
コメント
コメント一覧 (1件)
[…] あわせて読みたい 【Swift】enum(列挙型)について徹底的に解説: Xcode 15での実装ガイド […]