【问题标题】:Difference between associated and raw values in swift enumerations快速枚举中关联值和原始值之间的差异
【发布时间】:2015-05-26 15:26:31
【问题描述】:

Swift 枚举既有关联值也有原始值。但是我不清楚这些值的用例。因此,如果有人能解释关联值和原始值之间的区别,我将不胜感激,举个例子会很有帮助。

【问题讨论】:

    标签: swift enums enumeration


    【解决方案1】:

    原始值适用于枚举中的每个案例都由编译时设置值表示的情况。类似于常量,即

    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
    }
    

    【讨论】:

    • 如果是这样的:case A(orderNumber: Int, account:String) 那么关联的类型是什么? Int, String 上的元组?
    • @Honey “定义一个名为 Barcode 的枚举类型,它可以采用带有关联类型 (Int, Int, Int, Int) 的值的 upc 值,或者带有关联的 qrCode 值String 类型的值。” developer.apple.com/library/content/documentation/Swift/…
    【解决方案2】:

    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 .error = someResult {
        //some logic
    }
    
    

    关联的枚举

    if case .success(let result) = someResult, result == "ok" {
        //some logic
    }
    

    [Swift indirect enum]

    【讨论】:

      【解决方案3】:

      @Airspeed Velocity 和 @yoAlex5 的回答很好地解释了差异,但他们指出

      枚举可以有 either 关联的 either 原始值。

      对于 Swift 4 和 5,情况并非如此。 Here 很好地说明了将它们都放在一个枚举中。当然,您需要原始值初始化器的默认值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多