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

时间:2015-05-26 15:26:31

标签: swift enums enumeration

Swift枚举具有关联值和原始值。但是这些值的用例对我来说并不清楚。所以如果有人能解释相关值和原始值之间的区别,我真的很感激,一个例子会非常有用。

3 个答案:

答案 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的固定原始值,B1。它们都必须是相同的类型(原始值的类型是整个枚举,而不是每个单独的情况)。它们只能是字面可转换的字符串,字符或数字。并且它们都必须不同(没有两个枚举可以具有相同的原始值)。

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

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)

enter image description here

原始值

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很好地说明了将它们都包含在一个枚举中的情况。当然,您将需要原始值初始化程序的默认值。