发布于 2015-06-14 01:51:54 | 111 次阅读 | 评论: 0 | 来源: 网络整理
上一小节的例子演示了一个枚举的成员是如何被定义(分类)的。你可以为Planet.Earth
设置一个常量或则变量,并且在之后查看这个值。然而,有时候会很有用如果能够把其他类型的相关值和成员值一起存储起来。这能让你存储成员值之外的自定义信息,并且当你每次在代码中使用该成员时允许这个信息产生变化。
你 可以定义 Swift 的枚举存储任何类型的相关值,如果需要的话,每个成员的数据类型可以是各不相同的。枚举的这种特性跟其他语言中的可辨识联合(discriminated unions),标签联合(tagged unions),或者变体(variants)相似。
例如,假设一个库存跟踪系统需要利用两种 不同类型的条形码来跟踪商品。有些商品上标有 UPC-A 格式的一维码,它使用数字 0 到 9。每一个条形码都有一个代表“数字系统”的数字,该数字后接 10 个代表“标识符”的数字。最后一个数字是“检查”位,用来验证代码是否被正确扫描:
其他商品上标有 QR 码格式的二维码,它可以使用任何 ISO8859-1 字符,并且可以编码一个最多拥有 2,953 字符的字符串:
对于库存跟踪系统来说,能够把 UPC-A 码作为三个整型值的元组,和把 QR 码作为一个任何长度的字符串存储起来是方便的。
在 Swift 中,用来定义两种商品条码的枚举是这样子的:
enum Barcode {
case UPCA(Int, Int, Int)
case QRCode(String)
}
以上代码可以这么理解:
“定义一个名为Barcode
的枚举类型,它可以是UPCA
的一个相关值(Int
,Int
,Int
),或者QRCode
的一个字符串类型(String
)相关值。”
这个定义不提供任何Int
或String
的实际值,它只是定义了,当Barcode
常量和变量等于Barcode.UPCA
或Barcode.QRCode
时,相关值的类型。
然后可以使用任何一种条码类型创建新的条码,如:
var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
以上例子创建了一个名为productBarcode
的新变量,并且赋给它一个Barcode.UPCA
的相关元组值(8, 8590951226, 3)
。提供的“标识符”值在整数字中有一个下划线,使其便于阅读条形码。
同一个商品可以被分配给一个不同类型的条形码,如:
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
这时,原始的Barcode.UPCA
和其整数值被新的Barcode.QRCode
和其字符串值所替代。条形码的常量和变量可以存储一个.UPCA
或者一个.QRCode
(连同它的相关值),但是在任何指定时间只能存储其中之一。
像以前那样,不同的条形码类型可以使用一个 switch 语句来检查,然而这次相关值可以被提取作为 switch 语句的一部分。你可以在switch
的 case 分支代码中提取每个相关值作为一个常量(用let
前缀)或者作为一个变量(用var
前缀)来使用:
switch productBarcode {
case .UPCA(let numberSystem, let identifier, let check):
println("UPC-A with value of (numberSystem), (identifier), (check).")
case .QRCode(let productCode):
println("QR code with value of (productCode).")
}
// 输出 "QR code with value of ABCDEFGHIJKLMNOP.”
如果一个枚举成员的所有相关值被提取为常量,或者它们全部被提取为变量,为了简洁,你可以只放置一个var
或者let
标注在成员名称前:
switch productBarcode {
case let .UPCA(numberSystem, identifier, check):
println("UPC-A with value of (numberSystem), (identifier), (check).")
case let .QRCode(productCode):
println("QR code with value of (productCode).")
}
// 输出 "QR code with value of ABCDEFGHIJKLMNOP."