如何扩展Dictionary以使用Intervals

时间:2016-06-03 14:30:25

标签: swift

我想扩展词典以支持原生的间隔类型,例如 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 我还能尝试将其与原始用例保持接近吗?

1 个答案:

答案 0 :(得分:3)

扩展Range以使其Hashable

extension Range: Hashable {
    public var hashValue: Int {
        get {
            return "\(self.startIndex)_\(self.endIndex)".hashValue
        }
    }
}

如果您运行的是Swift 3 Alpha,请将startIndexendIndex替换为lowerBoundupperBound

(已修改)在Swift 2中Range<Double>是不可能的,但IntervalType可以同样的方式扩展

extension IntervalType {

    public var hashValue: Int {
        return "\(self)".hashValue
    }
}
extension HalfOpenInterval: Hashable {}
extension ClosedInterval: Hashable {}