<aside>
🕗 Swift
中枚举成员可以指定任意类型的关联值存储到枚举成员中,像其他语言的联合体和变体一样。
在 Swift
中,枚举类型是一等类型,采用了很多在传统上只被类所支持的特性,包括计算属性、实例方法、构造函数、扩展以及协议。
</aside>
<aside>
🍼 Swift
中的枚举成员没有默认的整型值。
</aside>
enum Beverage: CaseIterable {
case coffee, tea, juice
}
let numberOfChoices = Beverage.allCases.count
print("\\(numberOfChoices) beverages available")
// 打印“3 beverages available”
同一时间只能存储一个关联值。
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
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).")
}
// 打印“QR code: ABCDEFGHIJKLMNOP.”
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print("UPC: \\(numberSystem), \\(manufacturer), \\(product), \\(check).")
case let .qrCode(productCode):
print("QR code: \\(productCode).")
}
// 打印“QR code: ABCDEFGHIJKLMNOP.”
<aside> 🪅 原始值会对枚举成员预填充相同类型的值,原始值类型只能是基本数据类型,即不能有运行时的值,且赋值后不可更改。
</aside>
enum ASCIIControlCharacter: Character {
case tab = "\\t"
case lineFeed = "\\n"
case carriageReturn = "\\r"
}
<aside>
🥃 原始值需要在声明枚举时明确指出类型,如果类型为 Int
时,第一个成员赋值后,可自动推断后续成员的值,若第一个成员未赋值,则默认为 0
;如果类型为 String
时,默认为其成员名。
</aside>
enum Planet: Int {
case mercury = 1, venus, earth, mars = 5, jupiter, saturn, uranus, neptune
}
print(Planet.jupiter.rawValue)
// 打印: 6
enum CompassPoint: String {
case north, south, east, west
}
let earthsOrder = Planet.earth.rawValue
// earthsOrder 值为 3
let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection 值为 "west"