swift - 根据对象标识删除重复的类实例

标签 swift collections duplicates

我正在编写一个用于缓存类实例的组件。这些类本身不是ComparableHashableEquatable。如果是的话,各个操作的语义不一定能满足我们的目的,所以让我们假设我们不能使用这些协议(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/

相关文章:

excel - 如何在 VBA 中创建正确的集合?

java - ArrayList 对 String、int 进行排序

java - 将 List<Foo> 重构为 FooList

javascript - 在数组中搜索字符串的最佳方法

mysql - transient Mysql::错误:高流量站点上的重复条目 - 有什么想法吗?

ios - Swift 中的属性和变量有什​​么区别?

ios - 使用系统字体创建 SKLabelNode(UIFont 到字体名称)

json - 为什么不能快速将 JSON 发布到服务器?

mysql - 使用多值输入语句插入 IGNORE;重复会发生什么?

swift - 对受 Touch ID 保护的设备使用 3D Touch 操作