列挙型の性質
Objective-Cを含め、多くのプログラミング言語における列挙型は、「Mondayは1、Tuesdayは2」という具合に、整数などを表すラベルを提供するような機能を持つことが一般的です。しかし、Swiftの列挙型は、他の言語のそれとは異なる性質を持っています。
Swiftの列挙型では、メンバーがすべて同一の型を持つものとして扱われます。列挙型の値は、メンバーのいずれかになります。
さらに、他の型と同様に、列挙型についても型推論によるコンパイル時エラーチェックが行われます。
メソッドを定義することもでき、列挙型が現在とっているメンバーに応じた振る舞いを型に追加することができます。
Swiftの列挙型に固有の性質
- メンバーに具体的な値を入れる必要がなく、メンバーそのものを値として扱えます。
- 各メンバーに付随する型を入れられます。どのような型でも構いません。
- メンバーに具体的な値を入れた場合はObjective-Cの列挙型(NS_ENUM)のように扱えます。
- 列挙型自体を値型としてオブジェクトのように扱えます。メソッドも定義可能です。
Swiftにおける型の扱いには、値型(Value Type)と参照型(Reference Type)があると本連載第1回で述べましたが、列挙型として宣言した変数には、値(インスタンス)のコピーが渡されます。
列挙型の宣言は、enumキーワードを使用して、次のように記述します。各caseの後に宣言される値がメンバーです。プロトコル準拠やインスタンスメソッドを使用できる点は、Swiftの列挙型が持つ特徴の1つです。
enum SampleEnum : SomeProtocol { // プロトコル準拠 case Sample // メンバー case SampleAssociated(String) // メンバーに値を付随させる func printMember() { // インスタンスメソッド switch self { case .Sample: print("SampleMember") case .SampleAssociated: print("SampleAssociatedMember") } } static func printEnum() { // 型に紐ついたタイプメソッド println("SampleEnum") } }
列挙型の機能と動作
ここからは、次のように宣言したCustomResult列挙型を例に、Swiftの列挙型の機能とその動作の詳細を見ていきます。
enum CustomResult { case Success case Error }
メンバーを変数に代入
Swiftの列挙型では、メンバー自体を変数へ代入することができます。
var result = CustomResult.Error
この時点でresult変数は、型推論によってCustomResult列挙型のメンバーのいずれかであるとみなされます。
型が決定されていれば、CustomResultを省略して、ピリオドから同じ型のメンバーにアクセスすることができます。
result = .Success
こちらではresultに代入できる値はCustomResult型であるという型推論がなされているため、このような代入方法をとることができます。
switch文と列挙型の併用
switch文と列挙型を併用することで、ピリオド記法による条件判定が可能です。
次のコードでは、switch文の網羅性の規則に準じ、result変数の値に応じて列挙型のすべてのメンバーに関する処理を入れています。
var result = CustomResult.Success var content = 0 switch result { case .Success: content = 1 case .Error: break } println(content) // 1