You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:00:55