枚举(Enumeration)是 Swift 中的一种强大的数据类型,它允许你定义一组相关的值,并且每个值都被认为是同一类型的一部分。枚举可以帮助你组织代码,更好地表示和处理一组相关的值。
枚举的定义和使用 #
一个简单的枚举定义如下:
enum CompassPoint {
case north
case south
case east
case west
}
可以像这样声明一个枚举变量:
var direction = CompassPoint.north
你可以使用点语法来改变枚举的值:
direction = .east
关联值 #
枚举可以包含关联值,这使得枚举成员可以在其背后存储不同类型的关联值。关联值与枚举成员相关联,每个枚举成员的关联值类型可以各不相同。
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
你可以使用 switch
语句来匹配枚举值并提取关联值:
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check)")
case .qrCode(let productCode):
print("QR Code: \(productCode)")
}
原始值 #
枚举成员可以被预填充默认值,称为原始值(raw values)。这些原始值的类型可以是字符串、字符或任何整型或浮点类型,每个原始值在其枚举声明中必须是唯一的。
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
let earthsOrder = Planet.earth.rawValue // earthsOrder是3
你可以使用 rawValue
初始化一个枚举成员:
let possiblePlanet = Planet(rawValue: 3) // possiblePlanet 是 Planet.earth
枚举中的方法 #
枚举可以定义实例方法,方法可以访问枚举成员的值并运行一些逻辑:
enum CompassPoint {
case north, south, east, west
mutating func next() {
switch self {
case .north:
self = .east
case .east:
self = .south
case .south:
self = .west
case .west:
self = .north
}
}
}
var direction = CompassPoint.north
direction.next() // direction 现在是 .east
在这个例子中,next()
方法修改了 CompassPoint
枚举实例的值,并且因为它会修改实例,所以它被标记为 mutating
。
递归枚举 #
递归枚举是一种枚举类型,它有一个或多个枚举成员使用该类型的实例作为关联值。为了声明递归枚举,必须在枚举成员前使用 indirect
关键字。
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
// 你也可以在枚举前加上 indirect 关键字
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
下面是如何使用递归枚举来定义和计算算术表达式的例子:
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
func evaluate(_ expression: ArithmeticExpression) -> Int {
switch expression {
case .number(let value):
return value
case .addition(let left, let right):
return evaluate(left) + evaluate(right)
case .multiplication(let left, let right):
return evaluate(left) * evaluate(right)
}
}
let result = evaluate(product) // result 是 18
使用注意 #
- 一旦确定变量的类型,再次为其赋值可以省略枚举类型名,使用更简短的点语法即可。
- 与其他语言的枚举不一样的是,swift 的枚举成员在创建时不会被赋予一个默认的整型值。
- switch 时 case 要覆盖全,或者用
default
,不然会报错。
小结 #
- 定义枚举 使用
enum
关键字。 - 基础用法:可以定义基本成员,并通过点语法访问和设置。
- 关联值:允许枚举成员携带不同类型的值,增加灵活性。
- 原始值:为枚举成员预定义原始值,可以是字符串、整型或浮点数。
- 枚举方法:枚举可以包含方法,以增加行为逻辑。
- 递归枚举:允许枚举成员包含自身类型的实例,用于构建复杂的数据结构。
枚举在 Swift 中是非常强大的工具,有助于创建更加严谨和类型安全的代码。