我想扩展词典以支持原生的间隔类型,例如 HalfOpenInterval , ClosedInterval ,所以我可以做这样的事情:
var dict = [
0.0..<1.0 : "Okay",
1.0..<2.0 : "Better",
2.0..<3.0 : "Perfect"]
for (range, value) in dict {
print("\(value) is assigned to \(range)")
}
词典键类型必须符合 Hashable 协议,并且我认为我可以使用开始和结尾的组合制作哈希值属性,如果他们使用代码 Hashable :
public var hashValue: Int {
let halfshift = sizeof(Int)*4
return start.hashValue ^ ((end.hashValue << halfshift) | (end.hashValue >> halfshift))
}
我最好的尝试(完整代码):
extension IntervalType where Bound: Hashable {
public var hashValue: Int {
let halfshift = sizeof(Int)*4
return start.hashValue ^ ((end.hashValue << halfshift) | (end.hashValue >> halfshift))
}
}
extension HalfOpenInterval: Hashable where Bound: Hashable {}
extension ClosedInterval: Hashable where Bound: Hashable {}
因为没有工作 错误:类型扩展&#39; HalfOpenInterval&#39; with constraints不能有继承子句
考虑初始方法无法实现 swift 2.2 我还能尝试将其与原始用例保持接近吗?
答案 0 :(得分:3)
扩展Range
以使其Hashable
:
extension Range: Hashable {
public var hashValue: Int {
get {
return "\(self.startIndex)_\(self.endIndex)".hashValue
}
}
}
如果您运行的是Swift 3 Alpha,请将startIndex
和endIndex
替换为lowerBound
和upperBound
。
(已修改)在Swift 2中Range<Double>
是不可能的,但IntervalType
可以同样的方式扩展
extension IntervalType {
public var hashValue: Int {
return "\(self)".hashValue
}
}
extension HalfOpenInterval: Hashable {}
extension ClosedInterval: Hashable {}