Swift 枚举Enumerations

Swift里面的枚举和C,OC里面的最大区别是多了一个case.

枚举表达式

enum SomeEnumeration {
    // enumeration definition goes here
}

没有初始值和类型

// 例子1
enum CompassPoint{
    case North
    case South
    case East
    case West
}
var directionToHead = CompassPoint.West // 第一次声明一个变量的时候需要加上枚举名
directionToHead = .South // 第二次可以直接使用.操作
switch directionToHead {
case .North:
    print("Lots of planets have a north")
case .South:
    print("Watch out for penguins")
case .East:
    print("Where the sun rises")
case .West:
    print("Where the skies are blue")
}
// 在上面的例子中枚举CompassPoint并没有明确的数据类型,所以枚举也没有默认值 0  1  2  3 
// 例子2
// 枚举的多个case可以写在一行,中间使用","分割开
enum Planet {
    case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

关联值

苹果使用的是二维码和条形码的例子.

Swift 枚举Enumerations_第1张图片Swift 枚举Enumerations_第2张图片

// 例子3
enum Barcode {
    case UPCA(Int, Int, Int, Int) //条形码
    case QRCode(String)           // 二维码
}

var productBarcode = Barcode.UPCA(8, 85909, 51226, 3) // 给一个变量赋值
//productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
switch productBarcode {
case let .UPCA(numberSystem, manufacturer, product, check):
    print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case let .QRCode(productCode):
    print("QR code: \(productCode).")
}
在上面的例子中,都没有初始值和类型.

// 例子4 (给上面的例子2 增加了数据类型和初始值)
enum Planet1: Int {
    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
// 打印Raw Values
print("Venus.rawValue: \(Planet1.Venus.rawValue).") //Venus.rawValue: 2.
// 如果我们不做 Mercury = 1 的操作那么上面的打印结果是:Venus.rawValue: 1.
// 也就是说,我们在给一个枚举设置类型的时候,Swift会给我们一个默认初始值 Int类型的是从0开始
// 获取raw value 是7的枚举
let possiblePlanet = Planet1(rawValue: 7)
print("possiblePlanet: \(possiblePlanet)")

递归枚举

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)
}
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)
    }
}
 
// evaluate (5 + 4) * 2
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))
// Prints "18"


你可能感兴趣的:(enum,枚举,Enumerations)