使用结构作为 NSDictionary 的键

Using a struct as a key for NSDictionary

我正在尝试使用 struct 作为 NSDictionary 中的键。根据文档,它必须符合 Hashable 协议。
我这样做了,但我收到 DateRange 不符合协议 HashableEquatable 的错误。我该如何解决?
这是我的代码:

struct DateRange: Hashable {
    var startDate: NSDate {
        return self.startDate.timeIntervalSince1970.hashValue
    }

    var endDate: NSDate {
        return self.endDate.timeIntervalSince1970.hashValue
    }
}

Hashable 协议有一个必需的 属性,您必须在您的结构中实现它:

var hashValue: Int { get }

实施可散列协议并不意味着使其属性可散列 - 整个结构必须公开上述 属性,其中返回值理想情况下应该是唯一的,当然取决于内部状态.

请注意,Hashable 协议需要 Equatable 协议,该协议也必须实现。示例:

struct DateRange: Hashable, Equatable {
    var startDate: NSDate
    var endDate: NSDate

    var hashValue: Int {
        return self.startDate.hashValue + 37 * self.endDate.hashValue
    }
}

func == (lhs: DateRange, rhs: DateRange) -> Bool {
    return lhs.startDate == rhs.startDate && lhs.endDate == rhs.endDate
}

为了计算哈希值,我使用了 startDate 哈希值加上 endDate 哈希值的总和乘以 37(质数)。此解决方案未考虑溢出,您应该注意这一点以防止运行时错误。

除了@Antonio 的回答之外,here 还link 很好地解释了 Hashable 协议