Update: As of 斯威夫特 4.1(Xcode 9.4)编译器可以综合
这==
and hashValue
如果结构体的所有成员都是方法Equatable/Hashable
。因此只需声明一致性即可:
struct Cube: Hashable {
var x: Int
var y: Int
var z: Int
var width: Int
}
先前针对旧 Swift 版本的答案:
首先,Hashable
延伸Equatable
,所以你必须实施
A==
使用所有属性比较两个值的运算符
唯一标识一个立方体:
func ==(lhs: Cube, rhs: Cube) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.width == rhs.width
}
The Hashable
协议only要求
x == y
暗示x.hashValue == y.hashValue
so
var hashValue: Int {
return 0
}
将是一个有效的(并且有效的)实现。然而,这将
将所有对象放入集合(或字典)的同一个哈希桶中,
这是没有效果的。更好的实现例如
struct Cube: Hashable {
var x: Int
var y: Int
var z: Int
var width: Int
var hashValue: Int {
return x.hashValue ^ y.hashValue ^ z.hashValue ^ width.hashValue
}
}
这里是“异或”运算符^
被选择是因为它不能溢出。
您还可以使用“溢出运算符”&+
.
更复杂的哈希函数将能够区分
不同的值更好,这样设置操作变得更快。
另一方面,哈希函数本身的计算
会更慢。因此我会寻找一个“更好”的哈希函数
仅当集合操作被证明是程序中的性能瓶颈时。