比较对象Realm Swift

xoefb8l8  于 2023-04-28  发布在  Swift
关注(0)|答案(2)|浏览(125)

我正在尝试比较Swift中的两个Realm对象。

// Object 1 Prints:

currentObject:  Optional(ObjectClass {
    order = 0;
    number = 010;
    temp = 903;
    state = 6;

})

// Object 2 Prints:

 lastObject:  Optional(ObjectClass {
        order = 0;
        number = 010;
        temp = 903;
        state = 6;

    })

显然,这些值是相等的。但对象不是。

print(lastObject?.number == currentObject?.number) // Prints True
print(lastObject == currentObject) // Prints False

我尝试在object类中实现equatable。但Xcode不喜欢它,因为Realm。
“ObjectClass”与协议“Equatable”的冗余一致性
如何比较lastObject和currentObject的变量?我想有一个比检查每个对象的变量更好的方法。但我不知道是什么。
对象类:

import UIKit
import RealmSwift

class ObjectClass: Object {

    @objc dynamic var order = 0
    @objc dynamic var number = ""
    @objc dynamic var temp = 0
    @objc dynamic var state = 1

}
6jygbczu

6jygbczu1#

领域对象已经符合Equatable和Hashable,因为它们是NSObject的子类。你唯一需要做的就是重写isEqual方法:

import UIKit
import RealmSwift

class ObjectClass: Object {

    @objc dynamic var order = 0
    @objc dynamic var number = ""
    @objc dynamic var temp = 0
    @objc dynamic var state = 1

    override func isEqual(_ object: Any?) -> Bool {
        if let object = object as? ObjectClass {
            return self.order == object.order && self.number == object.number 
                   && self.temp == object.temp && self.state == object.state
        } else {
            return false
        }
    }
}
wwtsj6pe

wwtsj6pe2#

博士
更改对象类以包含主键,并且==将用于查看它们是否是相同的 * 对象 *。如果它们是同一个对象,那么它们的属性变量将总是相同的

class ObjectClass: Object {
    @objc dynamic var object_id = UUID().uuidString
    @objc dynamic var order = 0
    @objc dynamic var number = ""
    @objc dynamic var temp = 0
    @objc dynamic var state = 1

    override static func primaryKey() -> String? {
       return "object_id"
    }    
}

如果只想比较对象的属性,那么这是一个简单的属性间比较(或者实现isEqual并根据其他答案使用==)

讨论

当比较Realm对象时,我们需要了解我们在比较什么;你是想看看对象属性是否具有相同的值,还是想看看它们是否是相同的对象?
如果其他单词使用Realm对象

class RealmObject: Object {
   @objc dynamic var text = ""
}

如果创建了两个对象

let o0 = RealmObject()
o0.text = "Hello"

let o1 = RealmObject()
o1.text = "Hello"

我们比较了这些物体

print( o1 == o0 )

将打印false,因为o 0和o 1是两个独立的对象。
而如果我们比较一个属性

print( o0.text == o1.text )

会产生true,因为这些属性是相等的。
同样的道理,在境界3之后。8我相信你不能在没有主键的情况下使用Equatable来测试两个对象是否相同。看看这个

let o0 = ObjectClass()
o0.order = 1

try! realm.write {
   realm.add(o0)
}
            
let o1 = realm.objects(ObjectClass.self).first!          
print( o1 == o0 ) //prints false  
print( o1.isSameObject(as: o0) ) //prints true

但是,如果我们向ObjectClass添加主键

class ObjectClass: Object {
    @objc dynamic var object_id = UUID().uuidString
    @objc dynamic var order = 0

    override static func primaryKey() -> String? {
        return "object_id"
    }
}

并再次运行代码,它们都打印true

print( o1 == o0 ) //prints true  
print( o1.isSameObject(as: o0) ) //prints true

相关问题