我经常被诱惑将我的引用类型定义为Equatable
,通过将==
定义为===
。这使我能够替换冗长的:
collection.contains(where: { $0 === object })
使用:
collection.contains(object)
但我有一种烦人的感觉,似乎我正在做一些不对的事情™。将相等定义为身份的缺点是什么?这是一个常见的模式吗?
我经常被诱惑将我的引用类型定义为Equatable
,通过将==
定义为===
。这使我能够替换冗长的:
collection.contains(where: { $0 === object })
使用:
collection.contains(object)
但我有一种烦人的感觉,似乎我正在做一些不对的事情™。将相等定义为身份的缺点是什么?这是一个常见的模式吗?
仅在不可能出现对象的两种不同表示时,将相等定义为身份才有用。否则,您将得到外观相同但在比较相等时失败的对象。
当您保留对象缓存以确保使用单个对象表示相同实体时,这是可以接受的。
如果“一个实体-一个对象”的规则被打破,则您的对象在使用相等性的所有情况下都变得无用,例如哈希集、哈希映射和线性搜索。