比较对象领域 Swift

Comparing Objects Realm Swift

我正在尝试比较 Swift 中的 2 个领域对象。

// 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

我试图在对象 class 中实现 equatable。但是 Xcode 由于 Realm 的原因不喜欢它。

Redundant conformance of 'ObjectClass' to protocol 'Equatable'

如何比较 lastObject 和 currentObject 的变量?我想有比相互检查每个对象的变量更好的方法。但是我不知道它是什么。

对象Class:

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

}

Realm 对象已经符合 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
        }
    }
}

tl;博士

更改您的对象 class 以包含主键,== 将检查它们是否相同 对象。如果它们是同一个对象,那么它们的 属性 变量将始终相同

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"
    }    
}

如果您只想比较对象的属性,那么直接比较 属性 到 属性。

讨论

在比较 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,因为 o0 和 o1 是两个独立的对象。

而如果我们比较 属性

print( o0.text == o1.text )

会产生 true,因为这些属性是相等的。

按照同样的思路,在 Realm 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