008-Swift3.0之枚举
一、枚举语法
enum SomeEnumeration { // 枚举定义放在这里 }
二、定义枚举的几种方式
与C和Objective-C不同的是,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值
枚举成员值本身不会被隐式的赋值为0、1、2...
枚举成员本身就是完备的值
1.每个case表示一个枚举成员值
enum CompassPoint { case North case South case East case West } // 两种调用方式 var directionToHead1 = CompassPoint.West var directionToHead2: CompassPoint = .West
2.多个成员值可以出现在同一行上,用逗号隔开
enum Planet { case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune }
三、使用Switch语句匹配枚举值
enum Country { case China case America case Korea case Russia } var country: Country = .China switch country { case .China: print("我是中国人") case .America: print("我是美国佬") case .Korea: print("我来自朝鲜") case .Russia: print("我来自俄罗斯") }
四、关联值
如果一个枚举成员的所有关联值都被提取为常量,或者都被提取为变量,为了简洁,你可以只在成员名称前标注一个let或者var
enum Barcode { case UPCA(Int, Int, Int, Int) case QRCode(String) } var productBarcode1 = Barcode.UPCA(8, 85909, 51226, 3) switch productBarcode1 { case .UPCA(let numberSystem, let manufacturer, let product, let check): print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).") case .QRCode(let productCode): print("QR code: \(productCode).") } // 输出"UPC-A: 8, 85909, 51226, 3." var productBarcode2 = Barcode.QRCode("ABCDEFGHIJKLMNOP") switch productBarcode2 { case let .UPCA(numberSystem, manufacturer, product, check): print("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).") case let .QRCode(productCode): print("QR code: \(productCode).") } // 输出 "QR code: ABCDEFGHIJKLMNOP."
五、原始值
原始值可以是字符串,字符,或者任意整型值或浮点型值
每个原始值在枚举声明中必须是唯一的
原始值和关联值是不同的。原始值是在定义枚举时被预先填充的值。对于一个特定的枚举成员,它的原始值始终不变。关联值是创建一个基于枚举成员的常量或变量时才设置的值,枚举成员的关联值可以变化
1.显式赋值
enum ASCIIControlCharacter: Character { case Tab = "\t" case LineFeed = "\n" case CarriageReturn = "\r" }
2.隐式赋值
enum Planetn: Int { case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune } // 以此类推,1、2、3... enum Compass: String { case North, South, East, West } // 原始值分别为North、South、East、West
3.访问原始值(rawValue)
enum ASCIIControl: Character { case Tab = "\t" case LineFeed = "\n" case CarriageReturn = "\r" } let aSCIIControl = ASCIIControl.Tab.rawValue // aSCIIControl = "\t"
4.使用原始值初始化枚举实例
如果在定义枚举类型的时候使用了原始值,那么将会自动获得一个初始化方法
这个方法接收一个叫做rawValue的参数,参数类型即为原始值类型,返回值则是枚举成员或nil
enum IntNumber: Int { case One = 1 case Two = 2 case Three case Four case Five case Six case Seven case Eight case Nine case Ten } let number = IntNumber(rawValue: 20) // number为IntNumber?类型 if let number = number { switch number { case .One: print("One") default: print("其他") } }
六、递归枚举
递归枚举是一种枚举类型,它有一个或多个枚举成员使用该枚举类型的实例作为关联值
使用递归枚举时,编译器会插入一个间接层
你可以在枚举成员前加上indirect来表示该成员可递归
如果该枚举成员全都可递归,那么你可以在枚举定义之前加上indirect
1.部分枚举成员可递归
enum AA { case Number(Int) indirect case Addition(AA, AA) indirect case Multiplication(AA, AA) }
2.所有枚举成员可递归
indirect enum BB { case Number(Int) case Addition(BB, BB) case Multiplication(BB, BB) }
3.递归函数
enum CC { case Number(Int) indirect case Add(CC, CC) indirect case Mul(CC, CC) } func myFunc(enumC: CC) -> Int { switch enumC { case .Number(let value): return value case .Add(let left, let right): return myFunc(enumC: left) + myFunc(enumC: right) case .Mul(let left, let right): return myFunc(enumC: left) * myFunc(enumC: right) } } // 调用递归函数 let five = CC.Number(5) // five = 5 let four = CC.Number(4) // four = 4 let sum = CC.Add(five, four) // sum = 5 + 4 = 9 let product = CC.Mul(sum, CC.Number(2)) // product = sum * 2 = 9 * 2 = 18 let result = myFunc(enumC: product) // 18

浙公网安备 33010602011771号