枚举

枚举为一组关联的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值

枚举语法

1
2
3
4
5
enum someEnumration{
// 枚举定义放在这里
}

注:与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。

使用 Switch 语句匹配枚举值

关联值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//表示两种商品条形码的枚举
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}

var productBarcode = Barcode.upc(8, 32342, 1323, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
//这时,原始的 Barcode.upc 和其整数关联值被新的 Barcode.qrCode 和其字符串关联值所替代

//用swift case 提取关联值
switch productBarcode {
case .cup(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
print("QR code: \(productCode).")
}

//为了简洁,也可以在成员名称前标注一个let或者var
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
print("QR code: \(productCode).")
}

原始值

使用 ASCII 码作为原始值的枚举:

1
2
3
4
5
6
enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
注意:原始值和关联值是不同的,原始值在定义枚举是被预先填充的值,像上述三个ASCII码。对于一个特定的枚举成员,它的原始值始终不变。关联值是创建一个基于枚举成员的常量或者变量时才设置的值,枚举成员的关联值可以变化

原始值的隐式赋值

在使用原始值为整数或者字符串类型的枚举时,不需要显式地为每一个枚举成员设置原始值,Swift 将会自动为你赋值

1
2
3
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

使用枚举成员的 rawValue 属性可以访问该枚举成员的原始值:

1
2
let earthsOrder = Planet.earth.rawValue
// earthsOrder 值为 3

使用原始值初始化枚举实例

如果在定义枚举类型的时候使用了原始值,那么将会自动获得一个初始化方法,这个方法接收一个叫做rawValue的参数,参数类型即为原始值类型,返回值则是枚举成员或nil

1
let possiblePlanet = Planet(rawValue: 7)

注意:
原始值构造器是一个可失败的构造器,因为并不是每一个原始值都有与之对应的枚举成员。

递归枚举

递归枚举是一种枚举类型,它有一个或者多个枚举成员使用该枚举类型的实例作为关联值。你可以再枚举成员前面加上indirect来表示该成员可递归。

1
2
3
4
5
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
0%