iPhone
iOS
Swift
More than 3 years have passed since last update.

SwiftのENUMについて調べたのでメモとして残す


宣言

基本の宣言は以下になる

宣言の名前が違ければ、値が被ってもエラーにならない。


Swift

enum Fruits {

case Apple
case Banana
case Orange
}

enum Kudamono {
case Apple
case Banana
case Orange
}

,でつないで宣言することも可能

enum Fruits {Apple, Banana, Orange}

使い方は

var fruits = Fruits.Apple

もしくは

var fruits: Fruits = .Apple


Objective-C

Obj-Cの場合は下記は2重定義でエラーになる

だから宣言のprefixを付けて回避していた

// エラー

typedef NS_ENUM(NSUInteger, Fruits) {
Apple,
Banana,
Orange
};

typedef NS_ENUM(NSUInteger, Kudamono) {
Apple,
Banana,
Orange
};

// prefix付けて回避してた
typedef NS_ENUM(NSUInteger, Fruits) {
FruitsApple,
FruitsBanana,
FruitsOrange
};

typedef NS_ENUM(NSUInteger, Kudamono) {
KudamonoApple,
KudamonoBanana,
KudamonoOrange
};


宣言に値を入れられる

case Fruits {

case Apple = "りんご"
case Banana = "ばなな"
case Orange = "おれんじ"
}

値の取り出し方


rawValueで値にアクセスすることができる

var fruits = Fruits.Apple.rawValue

println(fruits) // りんご


関数定義

列挙型の中に関数作ることができる

case Fruits {

case Apple
case Banana
case Orange

func toString() -> String {
switch self
case .Apple:
return "りんご"
case .Banana:
return "ばなな"
case .Orange:
return "おれんじ"
}
}

使い方

var fruits = Fruits.Banana.toString()

println(fruits) // ばなな


値に引数をもたせられる

列挙型の値に引数を持たせ宣言することができる

enum User {

case Name(String, String)
case Address(String)
}

switch分などの評価時に引数を展開することが可能

var name = User.Name("たろう", "さとう")

switch name {
case. Name(let firstName, let lastName):
let fullName = "\(lastName) \(firstName)"
println(fullName) // さとう たろう
case. Address(let address):
let address = address
}


Switch文

列挙した値を網羅してないとエラーになる

case Fruits {

case Apple = "りんご"
case Banana = "ばなな"
case Orange = "おれんじ"
}

網羅してないと下記の場合エラーになる

// エラー

// Orangeがない
switch fruits {
case .Apple:
println("りんご")
case .Banana:
println("ばなな")
}

全部網羅してる、もしくは下記のようにdefaultで分岐すればOK

switch fruits {

case .Apple:
println("りんご")
case .Banana:
println("ばなな")
default:
println("default")
}

できることが多い印象