我在游乐场测试这个,我不知道该怎么做。使用没有关联值的普通枚举,一切都很好。
enum CompassPoint {
case North
case South
case East
case West
}
var direction = CompassPoint.East
if direction != .West {
println("Go West!")
}
但是,如果我的其中一个枚举具有关联值,则方向测试会因此错误而失败:无法找到成员' West'
enum CompassPoint {
case North(Int)
case South
case East
case West
}
var direction = CompassPoint.East
if direction != .West {
println("Go West!")
}
我可以做些什么才能进行此测试?
答案 0 :(得分:22)
如果枚举的原始值为Equatable
,则枚举会自动Equatable
。在您的第一种情况下,原始值假定为Int
,但如果您为其提供了另一种特定类型,例如UInt32
甚至String
,则会起作用。
但是,添加关联值后,与Equatable
的自动一致性不再发生,因为您可以声明:
let littleNorth = CompassPoint.North(2)
let bigNorth = CompassPoint.North(99999)
这些是平等的吗?斯威夫特怎么知道的?您必须通过将enum
声明为Equatable
然后实施==
运算符来告诉它:
enum CompassPoint : Equatable {
case North(Int)
case South
case East
case West
}
public func ==(lhs:CompassPoint, rhs:CompassPoint) -> Bool {
switch (lhs, rhs) {
case (.North(let lhsNum), .North(let rhsNum)):
return lhsNum == rhsNum
case (.South, .South): return true
case (.East, .East): return true
case (.West, .West): return true
default: return false
}
}
现在你可以测试相等或不平等,如下所示:
let otherNorth = CompassPoint.North(2)
println(littleNorth == bigNorth) // false
println(littleNorth == otherNorth) // true