Swift相關值
相關值(Associated Values)
上一小節的例子演示了一個枚舉的成員是如何被定義(分類)的。你可以為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."