swift枚举类型


成员值,关联值,原始值,swift枚举类型主要围绕着这三个概念展开。区分和理解了这三个概念,枚举基本就掌握的差不多了,下面是些另外需要注意的边边角角。

原始值构造器?

如果在定义枚举类型的时候使用了原始值,那么将会自动获得一个初始化方法,这个方法接收一个叫做rawValue的参数,参数类型为原始值类型,返回值则是枚举成员或nil

这个构造器称之为原始值构造器,是一个可失败构造器;因为并非所有的构造rawValue,都能匹配到一个成员,所以,原始值构造器总是返回一个可选的枚举成员。

关于这个构造器用途,个人觉得在做原始值匹配的时候,会比较方便,毕竟可以不用if else的嵌套结构来判断(情况比较多的时候,判断起来,写的不够简洁)。

有代表性的例子:

enum Planet: Int {
 case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

let positionToFind = 11
if let somePlanet = Planet(rawValue: positionToFind) {
    switch somePlanet {
    case .earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
    }
} else {
    print("There isn't a planet at position \(positionToFind)")
}
// 输出 "There isn't a planet at position 11

递归枚举?

递归枚举就是,一个或多个成员使用该枚举类型的实例作为关联值的枚举类型。

在枚举成员前加上indirect表示该成员可递归;而在枚举类型前加indirect,则表示其所有成员均是可递归的。

在递归的数据结构中如果有适合使用递归枚举的场景,或许能使代码简洁。

下面是创建表达式(5 + 4)* 2的例子;

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

// 创建表达式(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))  


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))
// 打印 "18"

Over!

知识共享许可协议本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,请务必在遵守许可协议的前提下转载。
发布时间:2018-11-28 14:44:30 阅读:935 标签:技术Swift笔记