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


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


8105
2018-05-26 15:26


起源

allinterview.com/showanswers/191460/... - sasquatch


答案:


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

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 具有固定的原始值 0B 的 1 等在编译时设置。它们都必须是相同的类型(原始值的类型是整个枚举,而不是每个单独的情况)。它们只能是字面可转换的字符串,字符或数字。而且他们都必须如此 不同 (没有两个枚举可以具有相同的原始值)。

相关值更像是与之相关的变量  列举案例:

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

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

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

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

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

13
2018-05-26 15:34



如果它是这样的: case A(orderNumber: Int, account:String) 那么相关的类型是什么? Int,String上的元组? - Honey
@Honey“定义一个名为Barcode的枚举类型,它可以取值为upc的值,其值为关联的类型(Int,Int,Int,Int),或者值为qrCode,其值为String类型的关联值。” developer.apple.com/library/content/documentation/Swift/... - Sakshi