我试图创建一个字典,其中键是我创建的结构体,值是整数数组。但是,我一直收到以下错误信息:
“类型'DateStruct'不符合协议'Hashable'”
我很确定我已经实现了必要的方法,但由于某种原因它仍然无法工作。
这是我的带有实现的结构体:
“类型'DateStruct'不符合协议'Hashable'”
我很确定我已经实现了必要的方法,但由于某种原因它仍然无法工作。
这是我的带有实现的结构体:
struct DateStruct {
var year: Int
var month: Int
var day: Int
var hashValue: Int {
return (year+month+day).hashValue
}
static func == (lhs: DateStruct, rhs: DateStruct) -> Bool {
return lhs.hashValue == rhs.hashValue
}
static func < (lhs: DateStruct, rhs: DateStruct) -> Bool {
if (lhs.year < rhs.year) {
return true
} else if (lhs.year > rhs.year) {
return false
} else {
if (lhs.month < rhs.month) {
return true
} else if (lhs.month > rhs.month) {
return false
} else {
if (lhs.day < rhs.day) {
return true
} else {
return false
}
}
}
}
}
有人可以解释一下为什么我仍然会收到这个错误吗?
==
是错误的?两个日期如果具有相同的日、月和年,它们的哈希值不是应该相同吗? - MarksCodehashValue
实现没问题。如果需要,你可以简单地返回 42(但请不要这样做)。从Hashable
文档中可以了解到:“一个哈希值由类型的hashValue
属性提供,它是一个整数,对于任意两个相等的实例,它是相同的。也就是说,对于同一类型的两个实例 a 和 b,如果 a == b,则 a.hashValue == b.hashValue。反之则不然:具有相等哈希值的两个实例未必相等。” 这就是为什么你需要修复你的==
函数。 - rmaddy==
使比较工作。您可以在没有哈希的情况下进行比较。hashValue
使值“可哈希”,从而允许将它们用作字典键或存储在某些其他形式的哈希映射/表中。请注意,Hashable
扩展了Equatable
。这意味着哈希取决于比较,但比较不取决于哈希。有关这两个协议的详细信息,请阅读文档。 - rmaddydict[DateStruct1] = 1
和dict[DateStruct2] = 2
,即使DateStruct1
和DateStruct2
可能具有相同的 hashValue,它也不会访问相同的字典条目,因为它还会使用==
进行比较。 - MarksCode