Swift 要对CGPoint进行哈希(到:)的哈希值
我有一个Swift类,它使用Point设置一个锚点,并使用hashValue符合Hashable。我需要更新我的类以符合新的协议,但是我不知道如何将hashValue更改为新的协议方法Swift 要对CGPoint进行哈希(到:)的哈希值,swift,hashtable,Swift,Hashtable,我有一个Swift类,它使用Point设置一个锚点,并使用hashValue符合Hashable。我需要更新我的类以符合新的协议,但是我不知道如何将hashValue更改为新的协议方法 class MyClass { var center: Point var x: Double { get { return center.x } set { center.x = newValue } } var y: Double {
class MyClass {
var center: Point
var x: Double {
get { return center.x }
set { center.x = newValue }
}
var y: Double {
get { return center.y }
set { center.y = newValue }
}
}
extension MyClass: Hashable {
var hashValue: Int {
return x.hashValue ^ y.hashValue
}
}
我知道我需要使用:
func hash(into hasher: inout Hasher {
}
我尝试过hasher.combine(),但我不知道如何将它与x.hashValue和y.hashValue一起使用,或者是否需要使用其他内容。请帮助。阅读以下内容:即使
点
被声明为某个有趣的地方,代码也不会编译,像return x.hashValue^y.hashValue
这样的代码正是引入哈希(into:)
的原因^
是将x
和y
散列在一起的可怕方式,因为冲突是如此可预测。每个点(0,0),(1,1),(2,2),…
都将散列到相同的值。感谢@Alexander Monica提供的信息。那很有趣。我以前没有用Hashable做过任何事情,所以有一点背景很好。是的,代码是编译的,我只发布了相关部分。再次感谢。IDK什么是Point
(它是CGPoint
的别名吗?),但将其包装到类中可能是个坏主意。假设原始的点
只是一个结构
,包含toDouble
s(每个8字节),那么它的大小将为16字节。在64位系统上,通过将其封装在一个类中,您又引入了16字节的开销,加上分配、ARC内存管理和取消分配的开销。您应该改用结构
,或者只在点
方向:扩展点:Hashable{…}