【发布时间】:2014-08-25 02:07:09
【问题描述】:
我已经定义了一个枚举来代表一个“站”的选择;站点由唯一的正整数定义,因此我创建了以下枚举以允许负值表示特殊选择:
enum StationSelector : Printable {
case Nearest
case LastShown
case List
case Specific(Int)
func toInt() -> Int {
switch self {
case .Nearest:
return -1
case .LastShown:
return -2
case .List:
return -3
case .Specific(let stationNum):
return stationNum
}
}
static func fromInt(value:Int) -> StationSelector? {
if value > 0 {
return StationSelector.Specific(value)
}
switch value {
case -1:
return StationSelector.Nearest
case -2:
return StationSelector.LastShown
case -3:
return StationSelector.List
default:
return nil
}
}
var description: String {
get {
switch self {
case .Nearest:
return "Nearest Station"
case .LastShown:
return "Last Displayed Station"
case .List:
return "Station List"
case .Specific(let stationNumber):
return "Station #\(stationNumber)"
}
}
}
}
我想将这些值用作字典中的键。声明 Dictionary 会产生 StationSelector 不符合 Hashable 的预期错误。使用简单的哈希函数很容易符合 Hashable:
var hashValue: Int {
get {
return self.toInt()
}
}
但是,Hashable 需要符合 Equatable,而且我似乎无法在我的枚举上定义等于运算符以满足编译器的要求。
func == (lhs: StationSelector, rhs: StationSelector) -> Bool {
return lhs.toInt() == rhs.toInt()
}
编译器抱怨这是在一行中的两个声明,并想在func 之后放置一个;,这也没有意义。
有什么想法吗?
【问题讨论】:
-
运算符必须在 Swift 的文件范围内定义。
-
枚举器已经是相等的。
-
不应该是
@infix func ==吗? -
@matt 看到我的回答。这仅适用于没有具有关联值的成员值的枚举。
-
@Cezar 很好,感谢您的更正。
标签: dictionary enums swift hashable