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

时间:2016-03-08 23:28:45

标签: swift enums

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

Difference between associated and raw values in swift enumerations

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

2 个答案:

答案 0 :(得分:5)

如果你想要枚举代表一个简单的常量字面值,请使用原始值。

enum PepBoy : String {
    case Manny = "Manny"
    case Moe = "Moe"
    case Jack = "Jack"
}

如果您希望枚举的情况携带预定义类型的任意值,请使用关联的类型。

enum Error : ErrorType {
    case Number(Int)
    case Message(String)
}

用法示例:

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 {
}

答案 1 :(得分:5)

您选择一个逻辑上符合您的业务案例/要求/功能/模型的商品。

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

RAW VALUE

enum CountryAcronyms: String {

    case UnitedKingdom  = "UK"
    case Germany        = "DE"
    case Australia      = "AU"
}

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

相关值

enum Trip {

    case Abroad(Airplane, Taxi, Foot)
    case Grandma(Tube, Foot)
    case McDonalds(Car)
    case MountEverest(Ski, Foot)
}  

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