Swiftでは同じ用途で使用するデータなどを一つにまとめて管理する列挙型(enum)があります。
この記事では、
・列挙型とは
・enumの定義と使い方
・型を省略する方法
・if文で比較する方法
・値を設定する方法
というenumの基本的な解説から、
・入れ子にする方法
・イニシャライザを使用する方法
・引数を指定する方法
などの応用的な使い方に関しても解説していきます。
今回はそんな列挙型(enum)の使い方についてわかりやすく解説します!
※この記事ではSwift4.0を使用しています。
列挙型とは
列挙型(enum)とは関連性のある事柄、データを一つにまとめた定数のようなものです。
列挙型は構造体やクラスを管理するよりも簡単にデータ構造の管理ができますし、ソースコードの可読性を向上させることができまます。
たとえば、果物を管理するFruits列挙体を作り、その中にAppleやMelonなどを入れて管理したいときは以下のように定義します。
列挙体の定義:
enum Fruits { case apple case orange case melon case banana case pineapple }
列挙体はenumを記述したあとに列挙体を管理する定数名を記述し、波カッコ{}で囲んだ中で「case 列挙子」のように記述します。
enumを使う ~基礎編~
定義と使い方
ここでは、列挙体enumの基本的な使い方を見ていきましょう。
以下に列挙体を定義して、値を参照する簡単なサンプルを紹介します。
サンプルプログラム
//列挙体の定義 enum Fruits { case apple case orange case melon case banana case pineapple } //列挙体の要素を取得 let basket = Fruits.apple print(basket)
実行結果:
apple
上記のサンプルでは列挙体Fruitsを定義し、波カッコ{}の中でcaseでapple、orangeなどの列挙子を指定しています。
列挙体を参照するには「列挙体名.列挙子」と記述します。
尚、型の中の列挙子名は以前指定した変数名などを使用できますが、1つの型で同じ値名を使用することはできません。
型を省略
enum型の変数を作った後に変数の中身の値を参照したい場合は、enum型の変数名を省略して、「.」から要素名を指定して参照することもできます。
サンプルプログラム
//列挙体の定義 enum Fruits { case apple case orange case melon case banana case pineapple } //列挙体の要素を取得 var basket: Fruits basket = .apple print(basket)
実行結果:
apple
上記のようにenum型の変数名を指定しないでも、値が参照できることがわかりますね!
if文で比較してみる
if文を使って変数内に入っているenumの定数が特定の値と一緒かどうかを調べることもできます。
以下にif文を使用してenumの値が一致するかを確認するサンプルを紹介します。
サンプルプログラム
//列挙体の定義 enum Fruits { case apple case orange case melon case banana case pineapple } let basket = Fruits.melon //if文による比較 if ( basket == .apple ) { print("This is an apple.") } else if ( basket == .orange ) { print("This is an orange.") } else if ( basket == .melon ) { print("This is an melon.") } else if ( basket == .banana ) { print("This is an banana.") } else if ( basket == .pineapple ) { print("This is an pineapple.") } else { print("It does not apply to any") }
実行結果:
This is an melon.
このようにenumの値をif文による条件分岐で使えることがわかりますね!
もちろんswitch文でも同様に使用することもできます。
if文、switch文の使い方については、以下の記事で詳しく解説しています!
値を設定する
列挙型の中の要素には、値を設定することもできます。
例えばFruitsの型の中の要素それぞれにりんご、メロン、オレンジという値を設定するには、
enum Fruits: String { case apple = "りんご" case orange = "オレンジ" case melon = "メロン" case banana = "バナナ" case pineapple = "パイナップル" }
とします。
そして、りんごを定数basketとして指定したい場合rawValueを使います。
let basket = Fruits.apple.rawValue
この結果、定数basketが指定しているのは「りんご」です。
enumを使う ~応用編~
入れ子にする
enumも入れ子として使用することができます。
例えば日曜日、月曜日、火曜日のいずれかの夕ご飯を決めるときは以下のように記述します。
サンプルプログラム
//列挙体の定義 enum Weekly { enum Dinner { case Pasta case Curry case Tenpura } case Sunday case Monday case Tuesday } let Week = Weekly.Sunday let Dinner = Weekly.Dinner.Curry print(Week) print(Dinner)
実行結果:
Sunday Curry
イニシャライザとは
イニシャライザとは、クラスのインスタンスを生成するときに、クラスのプロパティなどを初期化する目的で、自動で呼び出される処理のことを言います。
イニシャライザを使用することでクラスの記述内容がより分かりやすくなり、明確に初期化を行いソースコードの安全性を高めることができます。
インスタンスを生成と同時にメソッドを呼び出すにはinitメソッドを定義します。
そんなイニシャライザですが、enumで使用することもできます。
enumで使用するには、enumの波カッコ{}の中でinitメソッドを定義して、初期化を行います。
以下にenum内でinitメソッドを定義して、初期化を行うサンプルを紹介します。
サンプルプログラム
//列挙体の定義 enum Fruits { case apple case orange case melon case banana case pineapple init(){ self = Fruits.apple } } //インスタンスを生成 let cl = Fruits() print(cl)
実行結果:
apple
上記のサンプルではenum Fruits内でinitメソッドを定義しています。
初期化処理を行うにはクラスのようにenumに対してインスタンスの生成を「cl = Fruits()」のように記述して行います。
前述したようにインスタンスの生成と同時にinitメソッドが呼び出されて、処理が行われます。
イニシャライザについては、以下の記事でも詳しく解説しています!
引数を設定
enumのcaseで指定した列挙子では引数を指定することもできます。
引数を指定するときは、メソッドのように列挙子のあとにカッコ()で囲って、その中に引数を指定します。
以下にenumの列挙子に引数を指定するサンプルを紹介します。
サンプルプログラム
//列挙体の定義 enum Fruits { case apple(price: Int) case orange(price: Int) case melon(price: Int) case banana(price: Int) case pineapple(price: Int) } //引数を指定する let basket1 = Fruits.apple(price: 100) let basket2 = Fruits.orange(price: 80) print(basket1) print(basket2)
実行結果:
apple(100) orange(80)
上記のサンプルではenumの列挙子に引数を指定するために、「Fruits.apple(price: 100)」のように記述して引数を指定します。
メソッド同様enum側の引数の変数名、型も合わせておく必要があります。
まとめ
ここでは列挙型(enum)について、
・列挙型とは
・enumの定義と使い方
・型を省略する方法
・if文で比較する方法
・値を設定する方法
・入れ子にする方法
・イニシャライザを使用する方法
・引数を指定する方法
などについて解説しました。
列挙型のenumは同じ用途で使用する変数をまとめて管理したいときに非常に便利ですので、積極的に活用していきましょう。
もしenumの使い方を忘れてしまったら、この記事を思い出してくださいね。