我正在编写一个用于缓存类实例的组件。这些类本身不是Comparable
、Hashable
或Equatable
。如果是的话,各个操作的语义不一定能满足我们的目的,所以让我们假设我们不能使用这些协议(protocol)。
对象可以被缓存。多个键。因此,当向缓存请求所有缓存对象的列表时,我需要从底层字典的值集中删除重复项 - 相对于对象标识。
显然,这可以完成工作:
var result: [C] = []
for c in dict.values {
if !result.contains(where: { (rc: C) in rc === c }) {
result.append(c)
}
}
return result
但是,这具有二次运行时行为。与使用上述协议(protocol)(使用集合实现)时很容易获得的线性或预期线性行为相比,这是很糟糕的。
那么我们如何才能有效地删除重复项呢? Swift 集合中的对象标识?
最佳答案
我们可以将对象包装成可哈希
和可比较
的东西:
struct ClassWrap<T: AnyObject>: Hashable, Comparable {
var value: T
var hashValue: Int {
return ObjectIdentifier(self.value).hashValue
}
static func ==(lhs: ClassWrap, rhs: ClassWrap) -> Bool {
return lhs.value === rhs.value
}
static func <(lhs: ClassWrap<T>, rhs: ClassWrap<T>) -> Bool {
return ObjectIdentifier(lhs.value) < ObjectIdentifier(rhs.value)
}
}
现在,任何常规的Set
实现或其他独特的操作都可以完成这项工作。
关于swift - 根据对象标识删除重复的类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46661306/