比较对象领域 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
我正在尝试比较 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