Swift知识点8 - 枚举

创建枚举
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 码。对于一个特定的枚举成员,它的原始值始终不变。关联值是创建一个基于枚举成员的常量或变量时才设置的值,枚举成员的关联值可以变化。

原始值的隐式赋值:

  1. Int 只赋值第一个,其余值会类推
  2. 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))

你可能感兴趣的:(Swift知识点8 - 枚举)