代码之家  ›  专栏  ›  技术社区  ›  Raphael

基于对象标识删除重复的类实例

  •  0
  • Raphael  · 技术社区  · 8 年前

    Comparable , Hashable Equatable

    可以使用多个键缓存对象。因此,当要求缓存提供所有缓存对象的列表时,我需要从底层字典的值集中删除重复项——关于 对象标识

    显然,这起到了作用:

    var result: [C] = []
    for c in dict.values {
        if !result.contains(where: { (rc: C) in rc === c }) {
            result.append(c)
        }
    }
    return result
    

    然而,这具有二次运行时行为。与使用上述协议(使用set实现)时容易获得的线性或预期线性行为相比,这是不好的。

    那么,我们如何有效地从Swift集合中删除重复的w.r.t.对象标识呢?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Raphael    8 年前

    我们可以把物体包装成 Hashable Comparable :

    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 实施或其他独特的操作应该完成这项工作。