如何让CGSize遵循Hashable协议?两种实现方式该选哪一种?
给CGSize实现Hashable的正确方式
应该选第二种实现方式:
extension CGSize: Hashable { public func hash(into hasher: inout Hasher) { hasher.combine(NSCoder.string(for: self)) } }
原因:
Hasher.combine(_:)方法本身支持接收任何遵循Hashable协议的类型,String默认就符合这个协议,直接传入字符串即可让Hasher正确处理它的哈希逻辑,不需要手动调用.hashValue。- 第一种写法里手动取
hashValue再传入属于多此一举,而且hashValue是一个Int值,直接传入相当于只把这个Int的哈希合并进去,虽然最终哈希结果可能和第二种类似,但不符合Hashable协议的最佳实践,Hasher的设计就是要处理原始的Hashable类型,这样更稳妥。
额外建议:
其实更推荐直接合并CGSize的width和height来实现哈希,比通过NSCoder转字符串的方式更高效、直观:
extension CGSize: Hashable { public func hash(into hasher: inout Hasher) { hasher.combine(width) hasher.combine(height) } }
毕竟CGSize的核心就是这两个浮点值,直接合并它们的哈希才是最直接的实现方式。
内容的提问来源于stack exchange,提问作者erotsppa
相关产品推荐
相关产品推荐

