[英]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.