2017-10-10 12 views
0

クラスのインスタンスをキャッシュするためのコンポーネントを作成しています。クラスはそれ自体ではありませんComparable,HashableまたはEquatableです。もしそうであれば、それぞれの操作のセマンティクスが必ずしも私たちの目的に役立つわけではないので、それらのプロトコルを使うことはできないと考えましょう。オブジェクトIDに基づいて重複するクラスインスタンスを削除します。

オブジェクトはw.r.t.にキャッシュできます。複数のキー。だから、キャッシュにすべてのキャッシュされたオブジェクトのリストを要求するときは、オブジェクトIDに関して、基礎となる辞書の値セットから重複を削除する必要があります。

明らかに、これは仕事をしていません:

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

しかし、これは二次実行時の動作を持っています。上記のプロトコル(set実装を使用して)を使用するときに得やすい線形または予想の線形動作と比較すると、これは悪いことです。

どのようにすれば、重複したw.r.tを効率的に削除できますか。 SwiftコレクションのオブジェクトID

答えて

0

我々はHashableComparableあるものに私たちのオブジェクトをラップすることができます:今、任意の正規Set実装またはその他のユニーク・fying操作は仕事をする必要があります

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) 
    } 
} 

関連する問題