使用关键字enum
以及关键字case
定义枚举类型。
enum CompassPoint {
case North
case South
case East
case West
}
也可以将多个枚举条件写在一行内,使用逗号,
分隔。
enum CompassPoint {
case North, South, East, West
}
若一个枚举实例的类型已知,则可以使用缩写形式给该实例赋值。当然,从可读性上不建议这样写。
var directionToHead = CompassPoint.West
directionToHead = .East
Swift允许你对枚举条件设置常量或变量关联值,这个值可以是任何类型的值。这样,你可以给每个枚举条件添加自定义信息。
enum Barcode {
case UPCA(Int, Int, Int, Int)
case QRCode(String)
}
var productBarcode = Barcode.UPCA(8, 85909, 51226, 3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
对于设置了关联值的枚举类型,当使用switch
语句时可以提取其关联值,并且可以指定该关联值为常量(使用关键字let
)或变量(使用关键字var
)。
switch productBarcode {
case .UPCA(let numberSystem, let manufacturer, let product, let check):
print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case .QRCode(let productCode):
print("QR code: \(productCode).")
}
若提取的关联值都作为常量或都作为变量,则可以在关键字case
后添加关键字let
或关键字var
。
switch productBarcode {
case let .UPCA(numberSystem, manufacturer, product, check):
print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case let .QRCode(productCode):
print("QR code: \(productCode).")
}
枚举关联值的另一种形式就是枚举默认值,默认值可以是字符串、字符、整数、浮点数。但是,需要保证每个默认值是唯一的。
enum ASCIIControlCharacter: Character {
case Tab = "\t"
case LineFeed = "\n"
case CarriageReturn = "\r"
}
与枚举关联值不同的是,枚举默认值在你定义枚举类型时设置,并且每个枚举条件的默认值不会改变,而枚举关联值在创建枚举实例时设置,并且相同枚举条件对应的关联值可以不同。
Swift支持隐式地设置整数类型默认值或字符串类型默认值,对于整数类型默认值,若第一个枚举条件未设置默认值,则Swift自动设置其默认值为0,之后的枚举条件默认值依次递增。对于字符串类型默认值,每个枚举条件的默认值为该条件的名字。
enum Planet: Int {
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
// Planet.Venus的默认值为2
enum CompassPoint: String {
case North, South, East, West
}
// CompassPoint.South的默认值为"South"
你可以通过枚举实例的属性rawValue
访问其默认值。
let earthsOrder = Planet.Earth.rawValue
如果你定义了一个带默认值的枚举类型,那么该枚举类型自动实现一个带参数rawValue的初始化方法,该初始化方法返回枚举实例或nil值。
let possiblePlanet = Planet(rawValue: 7)
递归枚举是指一个关联值包含这个枚举实例的枚举,使用关键字indirect
声明递归枚举。
enum ArithmeticExpression {
case Number(Int)
indirect case Addition(ArithmeticExpression, ArithmeticExpression)
indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)
}
indirect enum ArithmeticExpression {
case Number(Int)
case Addition(ArithmeticExpression, ArithmeticExpression)
case Multiplication(ArithmeticExpression, ArithmeticExpression)
}