enum
避免瑣碎的定義根據史丹佛白鬍子教授Paul的發音,enum
唸作"衣囊"。
先談談沒有enum
的時候,如何使用變數(常數)表示共同認知的事物。假設我們要定義一些寵物種類,除了使用字串具體描述對象,最簡單的方式莫過於運用整數配合事先說好的規則(convention)。
var hisPet = 2 //表示是隻兔子
var herPet = 3 //但如果出現未定義的數值該怎麼辦?
使用enum
不需要繁瑣的定義,程式自然能區別變數的意義。
enum Pet {
case Dog
case Cat
case Rabbit
}
var hisPet = Pet.Dog
var herPet: Pet = .Cat
enum
的rawValue
配合rawValue定義enum
的值,可以讓enum
自帶有意義的資訊。
enum Pet: String {
case Dog = "🐶"
case Cat = "🐱"
case Rabbit = "🐰"
}
var myPet = Pet.Rabbit
println("my pet is a \(myPet.rawValue)") //output: my pet is a 🐰
enum
搭配switch
enum
最大的用處就是搭配switch
。
enum Pet {
case Dog
case Cat
case Rabbit
}
var myPet = Pet.Rabbit
switch myPet {
case .Dog: "is a dog"
case .Cat: "is a cat"
case .Rabbit: "is a rabbit" //return: "is a rabbit"
default: break //not necessary
}
只要
case
涵蓋所有enum
的可能性,switch
最後不使用default
捕捉剩餘可能也無妨。
Associated Value 讓enum
功能更強大,除了case
宣告的種類之外,還可以把值夾帶在enum
變數中。先判斷變數屬於那個case
,再透過(let name)
取出夾帶在enum
的值,用法請見範例。
enum Value {
case 整數(Int)
case 浮點(Float)
case 字串(String)
}
func describe(value: Value) -> String {
switch value {
case .整數(let int):
return "整數: \(int)"
case .浮點(let float):
return "浮點: \(float)"
case .字串(let string):
return "字串: \(string)"
}
}
describe(Value.整數(1234)) //return: "整數: 1234"
describe(Value.浮點(3.14)) //return: "浮點: 3.14"
describe(Value.字串("hello")) //return: "字串: hello"
enum
初始化函式enum
跟class
、struct
一樣,都可以有初始化函式,不過應該沒人會這麼使用吧?
enum Value {
case 整數(Int)
case 浮點(Float)
case 字串(String)
init() {
self = .字串("hello world")
}
}
var value = Value()