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

Ank*_*oel 13 enums enumeration swift

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

Air*_*ity 14

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

let A = 0
let B = 1
Run Code Online (Sandbox Code Playgroud)

类似于:

enum E: Int {
    case A  // if you don't specify, IntegerLiteralConvertible-based enums start at 0
    case B
}
Run Code Online (Sandbox Code Playgroud)

所以,A有一个固定的原始值0,B1等在编译时设置.它们都必须是相同的类型(原始值的类型是整个枚举,而不是每个单独的情况).它们只能是字面可转换的字符串,字符或数字.它们都必须是截然不同的(没有两个枚举可以具有相同的原始值).

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

enum E {
    case A(Int)
    case B
    case C(String)
}
Run Code Online (Sandbox Code Playgroud)

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

任何给定的类型值E将只保留一个相关类型,即Int如果枚举是a A,或者String如果枚举是a C.它只需要足够的空间来容纳两者中的较大者.像这样的类型有时被称为"有区别的联合" - 一个联合是一个可以容纳多种不同类型的变量,但你知道(从枚举案例中)它所持有的那个.

它们甚至可以是通用的.最常见的例子是Optional,定义如下:

enum Optional<T> {
    case .Some(T)
    case .None
}
Run Code Online (Sandbox Code Playgroud)