StackOverflow上的某个人已经为这个问题提供了一个很好的答案:swift中原始值和相关值之间的区别是什么。
Difference between associated and raw values in swift enumerations
但是,问题不包括何时使用原始值以及何时使用相关值的信息。这是我有点困惑的部分。如果有人可以向每个人解释,那将是非常重要的。我认为这是一个很快就会有很多初学者的问题。
答案 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方法,因为我们无法表达各种方法。