Swift: 9 枚舉
枚舉定義了一個通用類型的一組相關值,使得你可以在你的代碼中以類型安全的方式使用這些值。在Objective-C中,枚舉與一組整型值進行關聯。但是在Swift中,枚舉的成員變量類型可以是字符串、字符、整型或者浮點型的值。
枚舉語法
通過enum關鍵詞并且把整個定義放在一對花括號內來創建枚舉。與Objective-C不同的是,枚舉成員在創建時不會被賦予一個默認的整數值。
enum colorElement {
case R
case G
case B
case A
}
//或者直接逗號分隔進行定義
enum colorElementToo{
case R, G, B, A
}
var colorE = colorElement.R
//知道colorE的類型后,下次賦值時可以省略枚舉類型名
colorE = colorElement.G
switch colorE {
case .R:
print("紅")
case .G:
print("綠")
case .B:
print("藍")
case .A:
print("透明")
}
//打印結果:綠
關聯值
你可以定義Swift的枚舉來存儲任何類型的關聯值(associated),如果需要的話,對應每個成員的關聯值的數據類型可以是各不相同的。舉個例子,顏色值可以用RGBA(0-1浮點數)來表示,比如:白色(1.0,1.0,1.0,1.0),也可以用十六進制的字符串來表示,比如:#FFFFFFFF,使用枚舉的關聯值語法不僅可以在一個枚舉類型里面定義這兩種表達顏色的方式,同時還可以為每個類型賦值,從而可以枚舉出所有可能的顏色值。示例如下:
enum colorType{
case RGBA(Float,Float,Float,Float)
case HexStr(String)
}
var white = colorType.RGBA(1.0, 1.0, 1.1, 1.0)
var black = colorType.HexStr("#00000000")
//可以改變white和black的表示方式
white = .HexStr("#FFFFFFFF")
black = .RGBA(0.0, 0.0, 0.0, 1.0)
//在switch語句中使用,這次關聯值可以被提取作為switch語句的一部分
switch(black){
case .RGBA (let R,let G,let B,var A):
print("R G B A的值是:\(R),\(G),\(B),\(A)")
case .HexStr(let str):
print("十六進制值是:\(str)")
}
//如果一個case中所有的關聯值都是常量或者變量,
//那么let或var 關鍵字可以放在前面
switch(white){
case let .RGBA (R,G,B,A):
print("R G B A的值是:\(R),\(G),\(B),\(A)")
case let .HexStr(str):
print("十六進制值是:\(str)")
}
運行結果如下圖所示。
原始值
枚舉成員也可以只用原始值來預先填充,原始值的類型是一致的。原始值可以是字符串,字符,或者任何整型值或浮點值。每個原始值在它的枚舉聲明中必須是唯一的。當整型值被用于原始值,如果其他枚舉成員沒有值時,原始值會自動遞增。
//字符型
enum AControlChar: Character {
case Tab = "\t"
case Line = "\n"
case Return = "\r"
}
//整數型,成員值自增
enum Fruit: Int {
case Apple = 1, Banana , Orange, Juice
}
// Banana的原始值是2, Orange的原始值是3
可以使用枚舉的fromRaw方法來試圖找到具有特定原始值的枚舉成員,上面的例子,可以通過整數值3來找到Fruit中的Orange。不過,并不是所有可能的整型值都能匹配到Fruit的成員變量,所以,fromRaw方法有可能返回的值是nil,所以,fromRaw的返回值類型就是可選的Fruit,我們稱之為可選綁定(optional binding),可選綁定可以通過if語句來解綁。
//字符型
enum AControlChar: Character {
case Tab = "\t"
case Line = "\n"
case Return = "\r"
}
//整數型,成員值自增
enum Fruit: Int {
case Apple = 1, Banana , Orange, Juice
}
print(Fruit.Apple.rawValue)
print(AControlChar.Line.rawValue)
print(Fruit.Banana.rawValue)
let orangeBinding = Fruit(rawValue: 3)
if let orange = orangeBinding {
print("3是Fruit的一個成員變量的原始值")
}else{
print("3不是Fruit的一個成員變量的原始值")
}
let noneBinding = Fruit(rawValue: 6)
if let none = noneBinding {
print("6是Fruit的一個成員變量的原始值")
}else{
print("6不是Fruit的一個成員變量的原始值")
}
代碼運行結果如下圖。
示例代碼
https://github.com/99ios/23.10