转载

Swift Enumerations 笔记

0. Swift 可以定义很多形式的 Enum :普通的、关联值的(Associated Values)、原始值的(Raw Values)、递归的(Recursive Enumerations)、嵌套的等等

1. Swift 中的 Enum 也是 first class 类型,它拥有很多 Class 类型的特性:比如定义属性、方法、遵从协议等等

2. Enum 可以存储任何已知类型的关联值(Associated Values),每个 case项关联的类型都可以不一样

You can define Swift enumerations to store associated values of any given type, and the value types can be different for each case of the enumeration if needed.

enum Barcode {       case upc(Int, Int, Int, Int) // tuple 类型     case qrCode(String) // String 类型 }  // switch 匹配 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).") }  // 如果全部是 let 或 var 时,还可以将 let 或 var 提到前面 switch productBarcode {       case let .upc(numberSystem, manufacturer, product, check):     print("UPC : /(numberSystem), /(manufacturer), /(product), /(check).")     case let .qrCode(productCode):     print("QR code: /(productCode).") } 

3. Enum 可以用关联值存储不同类型的值,如果要相同类型的值还可以用原始值(Raw Values)方式来声明

enum ASCIIControlCharacter: Character {       case tab = "/t"     case lineFeed = "/n"     case carriageReturn = "/r" } 

4. Associated Values 和 Raw Values 的区别:Raw Values 在定义时相关的值就预填充好的,而 Associated Values 只定义了值的类型

Raw values are not the same as associated values. Raw values are set to prepopulated values when you first define the enumeration in your code, like the three ASCII codes above. The raw value for a particular enumeration case is always the same. Associated values are set when you create a new constant or variable based on one of the enumeration’s cases, and can be different each time you do so.

5. Raw Values 的 Enum 在定义时就需要指定相关的值,但如果定义的原始值是 integer 或 string 类型时可以不显式指定(测试时 float 也可以),系统会隐式地给它们赋值。

// 整型的原始值是指定值后续递增,不指定从 0 开始 enum Planet: Int {       case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune }  // 字符串的原始值为 case 名字 enum CompassPoint: String {       case north, south, east, west }  // 原始可以通过 rawValue 属性直接获取,如果不定义为 Raw Values 类型的 enum 是没有 rawValue 属性的 let earthsOrder = Planet.earth.rawValue   // earthsOrder is 3  let sunsetDirection = CompassPoint.west.rawValue   // sunsetDirection is "west" 

6. 定义为 Raw Values 类型的 Enum 可以用特有的初始化方法来实例化,它返回可能是一个 enumeration case 或 nil

let possiblePlanet = Planet(rawValue: 7)   // possiblePlanet is of type Planet? and equals Planet.uranus 

The raw value initializer is a failable initializer, because not every raw value will return an enumeration case.

7. 递归形的 Enum 的 case 项要用 indirect 修饰词来指定,如果所有 case 项都需要可以将修饰词提前

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) }  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)     } }  print(evaluate(product))   

P.S. 这篇 blog 还有很多 Enum 的其他用法: https://appventure.me/2015/10/17/advanced-practical-enum-examples/

原文  http://c0ming.me/swift-note-enumerations/
正文到此结束
Loading...