Swift枚举相关值
例如,假设一个库存跟踪系统需要利用两种不同类型的条形码来跟踪商品。有些商品上标有 UPC-A 格式的一维码,它使用数字 0 到 9。每一个条形码都有一个代表“数字系统”的数字,该数字后接 10 个代表“标识符”的数字。最后一个数字是“检查”位,用来验证代码是否被正确扫描:
其他商品上标有 QR 码格式的二维码,它可以使用任何 ISO8859-1 字符,并且可以编码一个最多拥有 2,953 字符的字符串:
对于库存跟踪系统来说,能够把 UPC-A 码作为三个整型值的元组,和把 QR 码作为一个任何长度的字符串存储起来是方便的。
在 Swift 中,用来定义两种商品条码的枚举是这样子的:
enumBarcode{caseUPCA(Int,Int,Int)caseQRCode(String)}
Swift
以上代码可以这么理解:
“定义一个名为Barcode的枚举类型,它可以是UPCA的一个相关值(Int,Int,Int),或者QRCode的一个字符串类型(String)相关值。”
这个定义不提供任何Int或String的实际值,它只是定义了,当Barcode常量和变量等于Barcode.UPCA或Barcode.QRCode时,相关值的类型。
然后可以使用任何一种条码类型创建新的条码,如:
varproductBarcode=Barcode.UPCA(8,85909_51226,3)
Swift
以上例子创建了一个名为productBarcode的新变量,并且赋给它一个Barcode.UPCA的相关元组值(8, 8590951226, 3)。提供的“标识符”值在整数字中有一个下划线,使其便于阅读条形码。
同一个商品可以被分配给一个不同类型的条形码,如:
productBarcode=.QRCode("ABCDEFGHIJKLMNOP")
Swift
这时,原始的Barcode.UPCA和其整数值被新的Barcode.QRCode和其字符串值所替代。条形码的常量和变量可以存储一个.UPCA或者一个.QRCode(连同它的相关值),但是在任何指定时间只能存储其中之一。
像以前那样,不同的条形码类型可以使用一个 switch 语句来检查,然而这次相关值可以被提取作为 switch 语句的一部分。你可以在switch的 case 分支代码中提取每个相关值作为一个常量(用let前缀)或者作为一个变量(用var前缀)来使用:
switch productBarcode
{
case.UPCA(let numberSystem,let identifier,let check):
print("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.”
Swift
如果一个枚举成员的所有相关值被提取为常量,或者它们全部被提取为变量,为了简洁,你可以只放置一个var或者let标注在成员名称前:
switch productBarcode
{
case let .UPCA(numberSystem,identifier,check):
print("UPC-A with value of\(numberSystem),\(identifier),\(check).")
case let .QRCode(productCode):
print("QR code with value of\(productCode).")
}// 输出 "QR code with value of ABCDEFGHIJKLMNOP."