当我阅读 swift 文档时,我无法理解这是什么意思?\n类型必须是可哈希的才能存储在集合\xe2\x80\x94中,也就是说,该类型必须提供一种计算自身哈希值的方法。哈希值是一个 Int 值,对于所有同等比较的对象来说都是相同的,因此如果 a == b,则得出 a.hashValue == b.hashValue。
\nSet
专为性能而设计。该contains(_:)
方法的Set
复杂度为 O(1),这意味着无论集合的大小,执行都需要恒定的时间。 contains(_:)
其复杂度Array
为 O(n),这意味着确定数组是否包含元素的时间随着数组大小的增加而增加。
a 是如何Set
做到这一点的?它使用 ahashValue
表示 的项目Set
,并包含一个类似于内部字典的结构,该结构将 映射hashValue
到带有 that 的项目列表hashValue
。这使得测试复杂结构(例如String
)的相等性非常快,因为Set
首先测试两个值是否具有相同的hashValue
。如果hashValue
s 不同,则不需要检查struct
s 本身的内容。
要测试 aSet
contains
值是否存在,只需hashValue
在字典中查找 a ,然后将该项与匹配的值进行比较。
因此,对于要包含在 a 中的项目Set
,提供一个哈希函数非常重要:
hashValues
以便项目广泛分布,并且不需要回退到较慢的相等性检查。(为了获得良好的性能)Hashable
struct
以下是适合存储在 a 中的a 的示例Set
:
struct Option: Hashable, CustomStringConvertible {
var title: String
var key: String
var value: Int
var description: String { return "{title: \"\(title)\", key: \"\(key)\", value: \(value)}" }
func hash(into hasher: inout Hasher) {
hasher.combine(title)
hasher.combine(key)
}
static func ==(lhs: Option, rhs: Option) -> Bool {
return lhs.title == rhs.title && lhs.key == rhs.key
}
}
Run Code Online (Sandbox Code Playgroud)
注意:在此示例中,仅将title
和key
属性视为相等。即使两个结构具有不同的属性,它们也可以相等value
。该hash(into:)
函数同样只考虑title
和key
属性。