[英]Difference between associated and raw values in swift enumerations
Swift 枚舉同時具有關聯值和原始值。 但是我不清楚這些值的用例。 因此,如果有人可以解釋關聯值和原始值之間的區別,我將非常感激,一個示例將非常有幫助。
原始值適用於枚舉中的每個案例都由編譯時設置值表示的情況。 類似於常量,即
let A = 0
let B = 1
類似於:
enum E: Int {
case A // if you don't specify, IntegerLiteralConvertible-based enums start at 0
case B
}
因此, A
在編譯時設置了一個固定的原始值0
, B
為1
等。 它們都必須是相同的類型(原始值的類型適用於整個枚舉,而不是每個單獨的案例)。 它們只能是文字可轉換的字符串、字符或數字。 而且它們都必須是不同的(沒有兩個枚舉可以具有相同的原始值)。
關聯值更像是變量,與枚舉情況之一相關聯:
enum E {
case A(Int)
case B
case C(String)
}
在這里, A
現在有一個關聯的Int
可以保存任何整數值。 另一方面, B
沒有關聯的值。 而C
有一個關聯的String
。 關聯類型可以是任何類型,而不僅僅是字符串或數字。
類型E
任何給定值將只保存關聯類型之一,即如果枚舉為A
則為Int
,如果枚舉為C
則為String
。 它只需要足夠的空間容納兩者中較大的一個。 像這樣的類型有時被稱為“有區別的聯合”——聯合是一個可以保存多種不同類型的變量,但你知道(從枚舉的情況下)它保存的是哪一種。
它們甚至可以是通用的。 最常見的例子是Optional
,它的定義如下:
enum Optional<T> {
case .Some(T)
case .None
}
Swift Enum 原始值與關聯值
Enumerations
或Enum
允許您創建一組有限的值和對集合中的單個值的枚舉變量引用
在 Swift 中,枚舉不能同時具有原始值和關聯值。
enum Color: String {
case white = "#ffffff"
case black = "#000000"
}
“原始值”是一種類型的唯一標識符。 這意味着您可以通過 ID 構造您的類型。 例如:
XCTAssertEqual(Color.white, Color(rawValue: "#ffffff"))
獲取原始值使用
Color.white.rawValue
enum Color {
case white
case black
case custom(hex: String)
}
Swift 的“關聯值”允許您將附加信息添加到可以動態定義的枚舉中。 請注意,當我們引入“關聯值”時,我們省略了“原始值”並添加了類型注釋。 這使得無法使用“原始值”來重建您的類型,因為它現在是動態設置的。
您可以按如下方式讀取“關聯值”:
let myColor = Color.custom(hex: "#ff00ff")
switch myColor {
case .custom(let hex):
print("custom color hex:\(hex)") //#ff00ff
case .white:
print("white color")
case .black:
print("black color")
}
Associated Value
枚舉的好例子是Result
[About]
請注意,Objective-C 不支持 Swift 的枚舉(Int-bound 除外)
還可以注冊相關的枚舉
if case .success(_) = someResult {
//some logic
}
@Airspeed Velocity 和 @yoAlex5 的回答很好地解釋了這種差異,但他們指出
枚舉可以有相關聯的任一原始值。
對於 Swift 4 和 5,情況並非如此。這里有一個很好的說明,將它們放在一個枚舉中。 當然,您需要原始值初始化程序的默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.