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

 

posted @ 2017-03-23 18:04  Frank9098  阅读(100)  评论(0)    收藏  举报