【发布时间】:2015-09-30 06:53:52
【问题描述】:
考虑:
enum Line {
case Horizontal(CGFloat)
case Vertical(CGFloat)
}
let leftEdge = Line.Horizontal(0.0)
let leftMaskRightEdge = Line.Horizontal(0.05)
如何在不使用 switch 语句的情况下直接访问 lefEdge 的关联值?
let noIdeaHowTo = leftEdge.associatedValue + 0.5
这甚至无法编译!
我查看了theseSOquestions,但似乎没有一个答案能解决这个问题。
上面的noIdeaHowTo 非编译行应该是那一行,但是因为associated value 可以是任何类型,我什至看不到用户代码如何编写“通用”get 或 associatedValue 方法le 枚举本身。
我最终得到了这个,但这很糟糕,每次添加/修改案例时都需要我重新访问代码...
enum Line {
case Horizontal(CGFloat)
case Vertical(CGFloat)
var associatedValue: CGFloat {
get {
switch self {
case .Horizontal(let value): return value
case .Vertical(let value): return value
}
}
}
}
任何指针任何人?
【问题讨论】:
-
我认为您所做的是正确的(即计算属性)。枚举可以具有任何类型的关联值,更重要的是任何计数。我看不出 Apple 如何在不强迫我们使用大量
as?和if的情况下提供对它们的速记访问。 -
顺便说一句,如果您的枚举具有与每个案例相关联的 CGFloat,您可以考虑使用原始值而不是关联。
-
@AntonBronnikov 原始值是恒定的,它们必须是唯一的,也就是说,您不能有两个具有不同值的
Horizontal实例。 -
是的。然后计算属性。
-
在 Swift 2 中,您可以在比 switch 更紧凑的
if中执行此操作:if case .Horizontal(let value) = leftEdge { print("value = \(value)") }