Swift枚举具有关联值和原始值。但是这些值的用例对我来说并不清楚。所以如果有人能解释相关值和原始值之间的区别,我真的很感激,一个例子会非常有用。
答案 0 :(得分:13)
原始值适用于枚举中的每个案例都由编译时设置值表示的情况。它类似于常数,即
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
类型的任何给定值只能保留其中一种关联类型,即枚举为Int
时为A
,如果为String
则为C
枚举是Optional
。它只需要足够的空间来容纳两者中的较大者。像这样的类型有时被称为"有区别的工会" - union是一个可以容纳多种不同类型的变量,但是你知道(从枚举的情况)它所持有的那个。
它们甚至可以是通用的。最常见的示例是enum Optional<T> {
case .Some(T)
case .None
}
,其定义如下:
<ServiceDefinition name="CloudConfiguration" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2014-06.2.4">
答案 1 :(得分:0)
enum Airport: String {
case munich = "MUC"
case sanFrancisco = "SFO"
case singapore = "SIN"
}
enum Airport {
case munich
case sanFrancisco
case singapore
case london(airportName: String)
}
Swift enum
可以拥有 raw values
或 associated values
。
了解更多here
答案 2 :(得分:0)
@Airspeed Velocity和@ yoAlex5的答案很好地解释了差异,但它们的陈述要比
枚举可以具有任意和任意原始值。
Swift 4和5并非如此。 Here很好地说明了将它们都包含在一个枚举中的情况。当然,您将需要原始值初始化程序的默认值。