为什么“领域集”对象随机工作?

时间:2019-05-21 06:26:58

标签: ios swift realm

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

主键不得更改,并且必须唯一。
所以我添加了另一个变量进行比较。
而且我重写了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; }]

每次运行时,值都是随机产生的。
我做错了什么?

1 个答案:

答案 0 :(得分:2)

要使Set正常工作,您的对象需要正确实现Hashable。领域Object已实现Hashable,并且可能是==实现调用了isEqual

不过,hash也应与isEqual保持一致,但是您尚未覆盖hash。您应该实现hash,以使两个相等的对象(由isEqual确定)具有相等的哈希值。

一种方法是这样:

override var hash: Int {
    return id.hash
}