使用结构作为 NSDictionary 的键
Using a struct as a key for NSDictionary
我正在尝试使用 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
}
}
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
协议 。
我正在尝试使用 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
}
}
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
协议 。