2017-10-10 54 views
0

我在写一个用于缓存类实例的组件。这些类别本身不是Comparable,HashableEquatable。如果是这样的话,相应操作的语义不一定会达到我们的目的,所以我们不能使用这些协议。基于对象标识删除重复的类实例

对象可以被缓存w.r.t.多个键。因此,当向缓存询问所有缓存对象的列表时,我需要从底层字典的值集中移除重复项 - 关于对象标识

显然,这样做的工作:

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

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

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

回答

0

我们可以换我们的对象到的东西,HashableComparable

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执行或以其他方式独特,fying操作应该做的工作。