快速枚举中关联值和原始值之间的差异

问题描述 投票:0回答:3

Swift 枚举既有关联值又有原始值。但我不清楚这些值的用例。因此,如果有人可以解释关联值和原始值之间的差异,我将非常感激,一个例子将非常有帮助。

ios swift enums enumeration
3个回答
21
投票

原始值适用于枚举中的每种情况都由编译时设置值表示的情况。它们类似于常数,即

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
等在编译时设置。它们都必须是相同的类型(原始值的类型适用于整个枚举,而不是每个单独的情况)。它们只能是可文字转换的字符串、字符或数字。它们都必须是不同(没有两个枚举可以具有相同的原始值)。

关联值更像是变量,与枚举案例中的one相关联:

enum E {
    case A(Int)
    case B
    case C(String)
}

在这里,

A
现在有一个关联的
Int
,可以保存任何整数值。另一方面,
B
没有相关价值。并且
C
有一个关联的
String
。关联类型可以是任何类型,而不仅仅是字符串或数字。

类型

E
的任何给定值将仅包含关联类型之一,即,如果枚举是
Int
,则为
A
;如果枚举为
String
,则为
C
。它只需要足够的空间容纳两个中较大的一个。像这样的类型有时被称为“可区分的联合”——联合是一个可以保存多种不同类型的变量,但你知道(从枚举情况)它保存的是哪一个。

它们甚至可以是通用的。最常见的例子是

Optional
,其定义如下:

enum Optional<T> {
    case .Some(T)
    case .None
}

3
投票

Swift Enum 原始值与关联值

[Swift 类型]

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
[关于]

请注意,Objective-C 不支持 Swift 的枚举(Int-bound 除外)

比较枚举中的值

原始枚举

if case .error = someResult {
    //some logic
}

关联枚举

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

[快速更改Enum关联值]

[Swift 间接枚举]


1
投票

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

枚举可以具有任一关联的任一原始值。

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

© www.soinside.com 2019 - 2024. All rights reserved.