Swift5 的 Enum

c语言中的enum仅仅能代表一个整型,swift对其进行了巨大地拓展。

简介

eunm 在swift中是 first-class types,能定义一个类型。比如:

enum ErrorCode{
    case code1
    case code2
}
var test = ErrorCode.code1

这里test就是一个ErrorCode类型,具体的值是code1. 既然test是ErrorCode类型,自然可以使用
test = ErrorCode.code2 对 test进行的值进行更改。打个不恰当的比方,如果把ErrorCode看作一个类,那么code1和 code2 就像已经创建好的实例变量,test变量就像一个深拷贝。

Associated Values

为了应对更加复杂的情况,swift增加了 Associated Values 的概念。Associated Values能够为一个case关联一个值,值的类型是任意的,而且每一个case的关联值的类型不需要统一。比如:

enum Barcode {
 case upc(Int, Int, Int, Int)
 case qrCode(String)
}

这里upc关联了一个(Int, Int, Int, Int), 而qrCode 关联的是String。

case的Associated Values 必须动态指定

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.

比如:


productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

如果想使用case里的Associated Values,必须使用switch case 语句:



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).")

}

rawValue

Raw value是 一种 特殊的Associated Values ,使用起来简单,适用于通常的enum场景。一个enum只能有一个Raw value类型,每个case的 rawValue都有 default 值,不必写代码动态指定。对于Int和String类型的rawValue,可以不把每个case都指定默认值,系统可以进行推算。从case值里面取rawValue也十分简单,不必再放入switch case 语句中。

Raw values can be strings, characters, or any of the integer or floating-point number types. Each raw value must be unique within its enumeration declaration.

比如:

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

注意,这个Int不能省略,否则系统不认为这个enum使用 raw Value 。

并且,系统会提供一个初始化方法,比如:

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
let possiblePlanet = Planet(rawValue: 7)

这个possblePlanet 是一个Optional类型,如果rawValue的输入参数对应的值不存在,possiblePlanet就会是nil。从这一点也能看出,系统必须限制rawValue的类型,因为需要判断rawValue是否和预定义值相等。

rawValue 和 Associated value 的区别在于:

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.

posted @ 2021-03-16 14:48  幻化成疯  阅读(286)  评论(0编辑  收藏  举报