我正在尝试使用struct
作为NSDictionary
中的密钥。根据文档,它必须符合Hashable
协议
我这样做了,但是我收到DateRange
不符合协议Hashable
和Equatable
的错误。我该如何解决?
这是我的代码:
struct DateRange: Hashable {
var startDate: NSDate {
return self.startDate.timeIntervalSince1970.hashValue
}
var endDate: NSDate {
return self.endDate.timeIntervalSince1970.hashValue
}
}
答案 0 :(得分:5)
Hashable
协议具有必须在结构中实现的必需属性:
var hashValue: Int { get }
实现hashable协议并不意味着使其属性具有可扩展性 - 它是必须公开上述属性的整个结构,其中返回值理想地应该是唯一的,当然取决于内部状态
请注意,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(素数)的总和。此解决方案没有考虑溢出,您应该注意防止运行时错误。
答案 1 :(得分:1)
除了@ Antonio的回答,here还有一个很好地解释Hashable
协议的链接。