为什么该领域设置对象随机工作



使用Realm对象的set的功能始终是随机的。

主要密钥不得更改,并且必须是唯一的。
所以我添加了另一个用于比较的变量。
我覆盖了iSequal(:)函数。

请参阅下面的代码。

class Model: Object {
    @objc dynamic var key = ""
    @objc dynamic var id = ""
    override static func primaryKey() -> String? {
        return "key"
    }
    override func isEqual(_ object: Any?) -> Bool {
        if let object = object as? Model {
            return id == object.id
        } else {
            return false
        }
    }
}
let model1 = Model()
model1.key = UUID().uuidString
model1.id = "hi"
let model2 = Model()
model2.key = UUID().uuidString
model2.id = "hi"
let model1Array = [model1]
let model2Array = [model2]
let set1 = Set(model1Array)
let set2 = Set(model2Array)
let result = set1.intersection(set2)
print(result) // []
let result = set1.intersection(set2)
print(result) // [Model { key = 9E814B97-D0CC-4550-BF7B-19645C1DB746; id = hi; }]
let result = set1.intersection(set2)
print(result) // []
let result = set1.intersection(set2)
print(result) // []
let result = set1.intersection(set2)
print(result) // [Model { key = 8A399388-1FA2-4699-8258-5DA5DFCEC203; id = hi; }]

每次我运行时,值都会随机出现。
我做错了什么?

Set才能正确工作,您的对象需要正确实现Hashable。领域Object已经实现了Hashable,大概是==实现isEqual

但是,hash也应与isEqual一致,但是您还没有覆盖hash。您应该实现hash,以使两个平等对象(由isEqual确定(具有相等的哈希。

一种方法是这样做:

override var hash: Int {
    return id.hash
}

最新更新