Swiftの三大データ構造であるSwift enum(列挙型)は、他の言語の列挙型と同じように連続した名前付きの定数を定義する技術です。Swift enum は構造体やクラスを定義するよりも手軽に関連したデータ構造を定義でき、その上Swiftの可読性をさらに向上させることができます。
Swift enumの書き方
要素の定義と参照の仕方を挙げ、基本的なSwift enumの書き方を示します。
・要素の定義
enum BloodType { case AB case A case B case O }
・要素の参照
(変数の方が決まっている場合は省略可能です。
let blood0 = BloodType.AB→let blood1 : BloodType = .B)
※上で紹介した列挙型ですが、下のように書くことで記述を一行に省略することができます。
case Blue, Yellow, Red
}
値の判定ではswitch文を使用
各要素の値を判定する際は、switch文を用いて実行します。
まず、要素の定義は次のように行います。
enum CompassPoint { case north case south case east case west }
値の判定は次のように行います。
var directionToHead = CompassPoint.west switch directionToHead { case .north: print("Lots of planets have a north") case .south: print("Watch out for penguins") case .east: print("Where the sun rises") case .west: print("Where the skies are blue") }
実行結果は下記のようになります。
値型 enumで値の割り当て
Swift enumの各要素に具体的な値を割り当てる際は、値型enumを使用します。
値の割り当ては次のように行います。
enum Signal: Int { case Blue = 1 case Yellow = 2 case Red = 3 }
具体的な値を取得するには次のようにrawValueプロパティを使います。
enumでの値の定義決め
自動的に割り振られる値を使用せず、そのenum要素が持てる値のタイプだけを定義させる場合には関連型enumを使用します。関連型enumは、付属型enumやAssociated Valuesとも呼ばれていますが、いずれの場合も書き方は次の通りです。
以下では要素の定義と各要素が取り得る値のタイプだけを定義しています。
enum Barcode { case UPCA(Int, Int, Int, Int) case QRCode(String) }
要素が取り得る具体的な値の定義は次のように行います。
var productBarcode = Barcode.UPCA(8, 85909, 51226, 3) productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
関連型enumを用いて各要素の定義に具体的な値を定義することで、構造体やクラスの定義をするよりも簡単に関連するデータ構造の定義を行うことができます。
enum自身にメソッドの定義
冒頭でも紹介しましたが、enum自身もクラス同様にメソッドを持つことができます。書き方を次に示します。
enum Fruit { case Apple case Banana case Orange case Melon func inJapaneseName() -> String { switch self { case .Apple: return "りんご" case .Banana: return "バナナ" case .Orange: return "みかん" case .Melon: return "メロン" } } } var fruit = Fruit.Apple.inJapaneseName() print(fruit)
実行結果は次のようになります。
おわりに
クラスや構造体の書き換えを行うことなく、手軽に値を指定できることがSwift enumを使用する利点となります。関連した定数をまとめる場合は、コードの可読性を高めるためSwift enumを積極的に利用しましょう。