使用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
}