在swift enum中,何时使用原始值以及何时使用相关值

Tho*_*hor 2 enums swift

StackOverflow上的某个人已经为这个问题提供了一个很好的答案:swift中原始值和相关值之间的区别是什么.

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

但是,该问题不包括何时使用原始值以及何时使用相关值的信息.这是我有点困惑的部分.如果有人可以向每个人解释,那将是非常重要的.我认为这是一个很快就会有很多初学者的问题.

mat*_*att 5

如果您希望枚举的大小写代表一个简单的常量字面值,请使用原始值.

enum PepBoy : String {
    case Manny = "Manny"
    case Moe = "Moe"
    case Jack = "Jack"
}
Run Code Online (Sandbox Code Playgroud)

如果你想要一个枚举的情况下进行预定义类型的任意值(一个或多个),使用相应的类型.

enum Error : ErrorType {
    case Number(Int)
    case Message(String)
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

let pb : PepBoy = .Manny
print(pb.rawValue) // "Manny" [and only ever "Manny", if the case is Manny]

do {
    let e = Error.Message("You screwed up") // attach a message [any message]
    throw e
} catch Error.Message(let whatHappened) { // retrieve the message
    print(whatHappened) // "You screwed up"
} catch {
}
Run Code Online (Sandbox Code Playgroud)


Ear*_*rey 5

您选择一个逻辑上匹配您的业务案例/要求/功能/模型更好的一个.

您应该查看swift Enum的解剖结构,并尝试在现实世界中找到与两个Enum变体之一匹配的案例/情境/选项.我会举两个例子.

原始价值

enum CountryAcronyms: String {

    case UnitedKingdom  = "UK"
    case Germany        = "DE"
    case Australia      = "AU"
}
Run Code Online (Sandbox Code Playgroud)

在这里,您处理的案例是Country的所有相同类别的事物,每个国家/地区可以由一个字母表中的单个首字母缩写词表示.这里重要的事实是,所有跨越首字母缩略词的基础类型是String.所以"RawValue"......换句话说就是当你选择一个和相同的基础类型来表示每个案例时.当您想要提取基础类型的基础值时,可以使用rawValue访问器.

相关价值

enum Trip {

    case Abroad(Airplane, Taxi, Foot)
    case Grandma(Tube, Foot)
    case McDonalds(Car)
    case MountEverest(Ski, Foot)
}  
Run Code Online (Sandbox Code Playgroud)

这里我们有一组案例,每个案例也代表一件事 - 一个旅行,但这个枚举中的相关类型代表了手段(这就是我们选择的......就是这样!也许有商业案例或设计......或者只是客户想要它...)并且由于每种情况的均值DIFFER,我们将一个能够代表均值的唯一类型(在这种情况下是元组与1种或更多种类型)相关联.由于我们想要代表这样的东西,我们无法选择以前的Enum方法,因为我们无法表达各种方法.