我正在操场上进行测试,不确定如何执行此操作。对于没有关联值的普通枚举,一切都很好。
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!") }
我该怎么做才能进行这项测试?
枚举Equatable的原始值为时,将自动进行枚举Equatable。在您的第一种情况下,假定原始值为Int,但是如果您给它指定另一个特定类型(例如UInt32或),它将有效String。
Equatable
Int
UInt32
String
但是,一旦添加了关联值,Equatable就不会再发生这种自动符合性,因为您可以声明以下内容:
let littleNorth = CompassPoint.North(2) let bigNorth = CompassPoint.North(99999)
那些相等吗?Swift应该怎么知道?您必须通过声明enumas Equatable并实现==运算符来告诉它:
enum
==
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