Alex Liang

Swift Enumerations

在C/C++中, 使用enum可提升程式碼的可讀性
而Swift的enum擴充原本的功能,使用上有更多的彈性

Syntax

1
2
3
4
5
6
7
8
9
enum ProgrammingLanguage {
case C
case CPP
case Objective-C
case Swift
}

let firstLanguage = ProgrammingLanguage.Swift
let secondLanguage = .CPP

不同於數C和Objetive-C,Swift的enum並沒有預設的整數值,也就是說case C並不隱含整數0的概念
使用時除了第一個比較傳統的寫法外;你也可以省略enum的型別名稱,這也是Swift的syntax sugar

1
2
3
4
5
6
7
8
9
10
let secondLanguage = .CPP

func selectLanguage(language: ProgrammingLanguage) {
switch language {
case .C: print("You chose C language")
case .CPP: print("You chose C++ language")
case .Objective-C: print("You chose Objective-C language")
case .Swift: print("You chose Swift language")
}
}

使用switch做判斷時一樣能用簡短的表示法。因為使為enum當參數,compiler會檢查型別,switch也能省去default的值

Associated Values

這是Swift的enum和其它語言不一樣的地方,我們能為enum創造關聯性的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
enum CurrencyType {
case USD(Double)
case TWD(Int)
}

var price = CurrencyType.USD(33.99)

func payCheck(price: CurrencyType) {
switch price {
case .USD(let usDollar):
let ntDollar = usDollar * 33
print("總共為: \(ntDollar) NTD")
case .NTD(let ntDollar):
print("總共為: \(ntDollar) NTD")
}
}

CurrencyType包含二種貨幣,美金和新台幣. 而前者需要Double來表示;後者則是Int
在宣告price時,我們給予一個Double的值表示美金的價錢;而switch case需要加上對應的參數
這項特性讓我們使用enum時除了表示狀態,還能給予相對應的值

Raw Values

除了上述的Associated Values, Swift的enum也有C/C++給予初值的特性

1
2
3
4
5
6
enum HTTPResponse {
case Continue = 100
case Success = 200
case MultipleChoices = 300
case NotFound = 404
}

這個例子中,HTTPResponse一開始就給予raw value. 而raw value只能為字串,字元,浮點數或整數,並且不能重複

Initializing from a Raw Value

假如定義了一組enum含有raw value,則我們能使用raw value查循狀態

1
2
3
4
5
6
7
8
9
enum HTTPResponse {
case Continue = 100
case Success = 200
case MultipleChoices = 300
case NotFound = 404
}

let statusCode = 300
let httpResponse = HTTPResponse(rawValue: statusCode) // MultipleChoices

將外界傳來status code回應HTTPResponse相對應的狀態;假如沒找到則回傳nil
rawValue回傳的值為optional,即使沒找到也不會讓程式hang住
下一篇接著介紹optional

參考來源:
官方文件