免费开源的iOS开发学习平台

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