簡體   English   中英

快速枚舉中關聯值和原始值之間的差異

[英]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在編譯時設置了一個固定的原始值0B1等。 它們都必須是相同的類型(原始值的類型適用於整個枚舉,而不是每個單獨的案例)。 它們只能是文字可轉換的字符串、字符或數字。 而且它們都必須是不同的(沒有兩個枚舉可以具有相同的原始值)。

關聯值更像是變量,與枚舉情況之一相關聯:

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 原始值與關聯值

EnumerationsEnum允許您創建一組有限的值和對集合中的單個值的枚舉變量引用

在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM