2017-10-10 55 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操作應該做的工作。