0

我正在尝试比较 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

我试图在对象类中实现 equatable 。但由于 Realm,Xcode 不喜欢它。

“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

}
4

2 回答 2

2

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
        }
    }
}
于 2020-05-31T04:25:23.860 回答
0

tl;博士

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

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
于 2020-05-31T12:24:14.497 回答