创建枚举
enum CompassPoint {
case north
case south
case east
case west
}
与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。在上面的 CompassPoint 例子中,north,south,east 和 west 不会被隐式地赋值为 0,1,2 和 3。相反,这些枚举成员本身就是完备的值,这些值的类型是已经明确定义好的 CompassPoint 类型。
关联值
能够把其他类型的关联值和成员值一起存储起来会很有用。这能让你连同成员值一起存储额外的自定义信息,并且你每次在代码中使用该枚举成员时,还可以修改这个关联值。
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 8218, 92132, 3)
productBarcode = .qrCode('IFUBASFJSBD')
同一时间只能存储这两个值中的一个。
提取关联值:
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print("\(numberSystem) + \(manufacturer) + \(product) + \(check)")
case .qrCode(let productCode):
print(productCode)
}
原始值
枚举成员可以被同类型的原始值填充。
enum ASCIIControlCharactor: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
原始值和关联值的区别:
原始值和关联值是不同的。原始值是在定义枚举时被预先填充的值,像上述三个 ASCII 码。对于一个特定的枚举成员,它的原始值始终不变。关联值是创建一个基于枚举成员的常量或变量时才设置的值,枚举成员的关联值可以变化。
原始值的隐式赋值:
- Int 只赋值第一个,其余值会类推
- String 字符串类型,默认的原始值为成员名称的字符串
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
原始值为:1,2,3,4,5,...
enum CompassPoint: String {
case north, south, east, west
}
原始值为:north, south, east, west
也可用原始值初始化枚举实例,返回值为可选类型 Planet? :
let possiblePlanet = Planet(rawValue: 7)
递归枚举
递归枚举是一种枚举类型,它有一个或多个枚举成员使用该枚举类型的实例作为关联值。使用递归枚举时,编译器会插入一个间接层。你可以在枚举成员前加上 indirect 来表示该成员可递归。
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
func evaluate(_ expression: ArithmeticExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(left, right):
return evaluate(left) + evaluate(right)
case let .multiplication(left, right):
return evaluate(left) * evaluate(right)
}
}
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
print(evaluate(product))