<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"

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