上一小節(jié)的例子演示了一個(gè)枚舉的成員是如何被定義(分類)的。你可以為Planet.Earth
設(shè)置一個(gè)常量或則變量,并且在之后查看這個(gè)值。然而,有時(shí)候會(huì)很有用如果能夠把其他類型的相關(guān)值和成員值一起存儲(chǔ)起來(lái)。這能讓你存儲(chǔ)成員值之外的自定義信息,并且當(dāng)你每次在代碼中使用該成員時(shí)允許這個(gè)信息產(chǎn)生變化。
你可以定義 Swift 的枚舉存儲(chǔ)任何類型的相關(guān)值,如果需要的話,每個(gè)成員的數(shù)據(jù)類型可以是各不相同的。枚舉的這種特性跟其他語(yǔ)言中的可辨識(shí)聯(lián)合(discriminated unions),標(biāo)簽聯(lián)合(tagged unions),或者變體(variants)相似。
例如,假設(shè)一個(gè)庫(kù)存跟蹤系統(tǒng)需要利用兩種不同類型的條形碼來(lái)跟蹤商品。有些商品上標(biāo)有 UPC-A 格式的一維碼,它使用數(shù)字 0 到 9。每一個(gè)條形碼都有一個(gè)代表“數(shù)字系統(tǒng)”的數(shù)字,該數(shù)字后接 10 個(gè)代表“標(biāo)識(shí)符”的數(shù)字。最后一個(gè)數(shù)字是“檢查”位,用來(lái)驗(yàn)證代碼是否被正確掃描:
其他商品上標(biāo)有 QR 碼格式的二維碼,它可以使用任何 ISO8859-1 字符,并且可以編碼一個(gè)最多擁有 2,953 字符的字符串:
對(duì)于庫(kù)存跟蹤系統(tǒng)來(lái)說,能夠把 UPC-A 碼作為三個(gè)整型值的元組,和把 QR 碼作為一個(gè)任何長(zhǎng)度的字符串存儲(chǔ)起來(lái)是方便的。
在 Swift 中,用來(lái)定義兩種商品條碼的枚舉是這樣子的:
enum Barcode {
case UPCA(Int, Int, Int)
case QRCode(String)
}
以上代碼可以這么理解:
“定義一個(gè)名為Barcode
的枚舉類型,它可以是UPCA
的一個(gè)相關(guān)值(Int
,Int
,Int
),或者QRCode
的一個(gè)字符串類型(String
)相關(guān)值。”
這個(gè)定義不提供任何Int
或String
的實(shí)際值,它只是定義了,當(dāng)Barcode
常量和變量等于Barcode.UPCA
或Barcode.QRCode
時(shí),相關(guān)值的類型。
然后可以使用任何一種條碼類型創(chuàng)建新的條碼,如:
var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
以上例子創(chuàng)建了一個(gè)名為productBarcode
的新變量,并且賦給它一個(gè)Barcode.UPCA
的相關(guān)元組值(8, 8590951226, 3)
。提供的“標(biāo)識(shí)符”值在整數(shù)字中有一個(gè)下劃線,使其便于閱讀條形碼。
同一個(gè)商品可以被分配給一個(gè)不同類型的條形碼,如:
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
這時(shí),原始的Barcode.UPCA
和其整數(shù)值被新的Barcode.QRCode
和其字符串值所替代。條形碼的常量和變量可以存儲(chǔ)一個(gè).UPCA
或者一個(gè).QRCode
(連同它的相關(guān)值),但是在任何指定時(shí)間只能存儲(chǔ)其中之一。
像以前那樣,不同的條形碼類型可以使用一個(gè) switch 語(yǔ)句來(lái)檢查,然而這次相關(guān)值可以被提取作為 switch 語(yǔ)句的一部分。你可以在switch
的 case 分支代碼中提取每個(gè)相關(guān)值作為一個(gè)常量(用let
前綴)或者作為一個(gè)變量(用var
前綴)來(lái)使用:
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.”
如果一個(gè)枚舉成員的所有相關(guān)值被提取為常量,或者它們?nèi)勘惶崛樽兞浚瑸榱撕?jiǎn)潔,你可以只放置一個(gè)var
或者let
標(biāo)注在成員名稱前:
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."