Swift 从哈希值计算中省略属性

Swift 从哈希值计算中省略属性,swift,Swift,有没有一种方法可以使用hash(into:)来计算结构/类的hashvalue,同时省略某些属性 i、 e 我希望这能奏效: let cache = Set<CacheItem>() let item1 = CacheItem(val1: 0, val2: 0) let item2 = CacheItem(val1: 0, val2: 0) cache.insert(item1) assert(cache.contains(item2)) let cache=Set() 让ite

有没有一种方法可以使用
hash(into:)
来计算结构/类的hashvalue,同时省略某些属性

i、 e

我希望这能奏效:

let cache = Set<CacheItem>()
let item1 = CacheItem(val1: 0, val2: 0)
let item2 = CacheItem(val1: 0, val2: 0)

cache.insert(item1)
assert(cache.contains(item2))
let cache=Set()
让item1=CacheItem(val1:0,val2:0)
让item2=CacheItem(val1:0,val2:0)
cache.insert(item1)
断言(cache.contains(item2))

但是,它不起作用。

一个
集合是一个独特对象的集合,相等性是基于与
=
的比较。相等的对象必须具有相同的哈希值,但不是相反:不同的对象可以具有相同的哈希值。(一个简单的例子:有264个可能的散列值,但无限多的字符串。因此,必须有具有相同散列值的不同字符串。)

可散列集合(如
Set
Dictionary
)在其实现中使用散列值(例如,将不同的对象放入不同的“bucket”),但它们从不单独使用散列值来确定相等性

==
的默认实现比较所有(存储的)属性是否相等。因此,在您的情况下,如果
item1
item2
具有相同的
val1
val2
但不同的
date
,则它们是不同的对象,即使它们具有相同的哈希值

如果您希望将具有相同
val1
val2
但不同
date
的对象视为相等,则必须自己实现
=

struct CacheItem: Codable, Hashable {
    // ...
    
    static func ==(lhs: CacheItem, rhs: CacheItem) -> Bool {
        return lhs.val1 == rhs.val1 && lhs.val2 == rhs.val2
    }
}
然后

var cache=Set()
让item1=CacheItem(val1:0,val2:0)
让item2=CacheItem(val1:0,val2:0)
cache.insert(item1)
打印(缓存包含(项目2))
将始终打印
true

struct CacheItem: Codable, Hashable {
    // ...
    
    static func ==(lhs: CacheItem, rhs: CacheItem) -> Bool {
        return lhs.val1 == rhs.val1 && lhs.val2 == rhs.val2
    }
}
var cache = Set<CacheItem>()
let item1 = CacheItem(val1: 0, val2: 0)
let item2 = CacheItem(val1: 0, val2: 0)

cache.insert(item1)
print(cache.contains(item2))