swift从零开始-09-枚举

2017-11-17  本文已影响2人  SPIREJ

枚举为一系列相关的值定义了一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值。

枚举语法

enum SomeEnumeration {
    //在这里定义枚举
}

例:

enum CompassPoint {
    case North
    case South
    case East
    case West
}

关键字case是标明这一行是要定义一个新的成员变量
注意:与C和OC不同的是,swift中的枚举成员初始的时候不会被默认为整数值,比如不会隐式的默认为0,1,2,3这样,取而代之的是不同的枚举成员变量将要用什么类型以及赋值什么值都可以自己控制。
多个成员可以用一行来定义,用逗号隔开

enum Plant {
    case A, B, C, D, E, F, G
}
var directionToHead = CompassPoint.North

当 directionToHead 在初始化时被赋值成CompassPoint中的某一个可能的值得时候,它的类型就可以被推测出来,现在这里directionToHead被声明为了CompassPoint类型,那么就可以简短的使用逗号表达式来给它赋值成其他的CompassPoint当中的值了

directionToHead = .East

用switch语句来匹配枚举值

directionToHead = .South
switch directionToHead {
case .North:
    print("north point")
case .South:
    print("south point")
case .East:
    print("east point")
case .West:
    print("west point")
}

一个switch语句被用作判断枚举值得时候,必须要包括所有的枚举成员。要确保枚举的所有成员不被忽略掉,否则报错。或者提供一个default来覆盖其他没有明确处理的成员

关联值
例:一个可以定义两个格式的产品条形码的枚举看起来是这样的:

enum Barcode {
    case UPCA(Int, Int, Int)
    case QRCode(String)
}

可以这样阅读这段代码:定义了一个叫Barcode的枚举类型,它可以有一个UPCA成员,这个成员关联了一个包含三个整型数值的元组,同时这个枚举类型还有一个QRCode成员,关联了一个字符串
switch语句做检查

var productBarcode = Barcode.UPCA(8, 873_89999, 21)
productBarcode = Barcode.QRCode("ABCDFUUHSWYSGAJGG")

switch productBarcode {
case .UPCA(let num1, let num2, let num3):
    print("UPC-A with value of \(num1),\(num2),\(num3)")
case .QRCode(let productcode):
    print("QR code with value of \(productcode)")
}

如果一个枚举成员关联的所有值都被当做不可变变量或者可变变量来使用,那么可以在成员名称之前只放一个let或者var来达到目的

switch productBarcode {
case let .UPCA(num1, num2, num3):
    print("UPC-A with value of \(num1),\(num2),\(num3)")
case let .QRCode(productcode):
    print("QR code with value of \(productcode)")
}

class Counter {
    var count = 0
    func increment() {
        count += 1
    }
    func increment(amount: Int) {
        count += amount
    }
    func reset() {
        count = 0;
    }
}

let counter = Counter()

原始值
枚举类型的成员可以预设置默认值(原始值)这些值得类型是相同的
原始值可以是字符串,字符或者其他任何的整型或者浮点型数字类型
如果原始值是整数类型,那么当其他枚举成员没有设置原始值的时候,它们的原始值是这个整型原始值自增长设置的

enum planet: Int {
    case A = 1, B, C, D, E, F, G
}

可以通过枚举成员rawValue()方法来获取它的原始值

let values = planet.C.rawValue
print(values)

递归枚举
递归枚举是一种枚举类型,它有一个或多个枚举成员使用该枚举类型的实例作为关联值。使用递归枚举时,编译器会插入一个间接层。你可以在枚举成员前加上indirect来表示该成员可递归。

例:枚举类型存储了简单的算术表达式

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

也可以在枚举类型开头加上 indirect 关键字来标明枚举的所有成员都是可以递归的

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

上面定义的枚举类型可以存储三种算术表达式:纯数字,连个表达式相加,两个表达式相乘

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

func evaluate(expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(expression: left) + evaluate(expression: right)
    case let .multiplication(left, right):
        return evaluate(expression: left) * evaluate(expression: right)
    }
}

print(evaluate(expression: product))
//打印18
上一篇下一篇

猜你喜欢

热点阅读