メンバー付随型
列挙型の各メンバーに付随させたい値の型を指定することで、メンバーに付随した具体的な値を入れることができます。
enum CustomResult {
case Success(Int, String)
case Error(String)
}
上記の宣言では、Successに伴う具体的な値として(Int, String)型のタプル値を、Errorに伴う具体的な値としてString型の値を、メンバーとともに指定できます。
var result = CustomResult.Success(3, "wow")
result = .Error("failed")
メンバーに付随型がある場合には、switch文でletを使うことにより、付随値を取り出すことができます。
var result = CustomResult.Success(10, "hour")
switch result {
case .Success(let number, let message):
println("number : \(number), message : \(message)")
case .Error(let message):
println("error : \(message)")
}
// "number : 10, message : hour"
メンバーの付随値に1つ1つletを指定する必要はありません。次のように、メンバーに対してletを指定することも可能です。
var result = CustomResult.Error("failed")
switch result {
case let .Success(number, message):
println("number : \(number), message : \(message)")
case let .Error(message):
println("error : \(message)")
}
// "error : failed"
生の値としての列挙型
Objective-CにおけるNS_ENUMと同じように、具体的なInt型などが入った列挙型も宣言できます。
enum Fruits : Int {
case Orange = 1, Banana, Apple
}
Swiftの列挙型には、メンバーから具体的な値を取り出すためにtoRaw()メソッドが、具体的な値からメンバーに変換するためにfromRow()メソッドが、それぞれ用意されています。
var orange = Fruits.Orange var orangeNum = orange.toRaw() // 1 var banana = Fruits.fromRaw(2) // Fruits.Banana
なお、上記の例にあるfromRaw()メソッドは、後で解説するオプショナル列挙型にFruitsをくるんで返します。Int型を指定してメンバーを取得できない場合があるためです。
列挙型のメソッド
Swiftの列挙型には、メソッドを定義することも可能です。メンバーごとに異なる振る舞いを定義したい場合に便利です。
enum CustomResult {
case Success(Int, String)
case Error(String)
func printMessage() {
switch self {
case let .Success(num, message):
println(message)
case let .Error(message):
println(message)
}
}
}
var result = CustomResult.Success(1, "sleeping")
result.printMessage() // sleeping
