首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比较对象领域Swift

比较对象领域Swift
EN

Stack Overflow用户
提问于 2020-05-31 03:36:06
回答 2查看 1.1K关注 0票数 0

我正在试着比较Swift中的两个领域对象。

代码语言:javascript
运行
复制
// 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;

    })

很明显,这些值是相等的。但物体不是。

代码语言:javascript
运行
复制
print(lastObject?.number == currentObject?.number) // Prints True
print(lastObject == currentObject) // Prints False

我试图在object类中实现相等。但是Xcode不喜欢它,因为领域。

”与“等价”协议的ObjectClass冗余一致性

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

对象类:

代码语言:javascript
运行
复制
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

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-31 04:25:23

由于领域对象是NSObject的子类,因此它们已经符合可等效的和可接受的。唯一需要做的事情是重写isEqual方法:

代码语言:javascript
运行
复制
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
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2020-05-31 12:24:14

tl;dr

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

代码语言:javascript
运行
复制
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"
    }    
}

如果您只想比较对象属性,那么它是一个简单的属性和属性比较。

讨论

在比较领域对象时,我们需要了解我们正在比较的内容;您是否也在查看对象属性是否具有相同的值,还是希望查看它们是否是相同的对象?

如果其他词接受一个领域对象

代码语言:javascript
运行
复制
class RealmObject: Object {
   @objc dynamic var text = ""
}

如果创建了两个对象

代码语言:javascript
运行
复制
let o0 = RealmObject()
o0.text = "Hello"

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

我们比较了物体

代码语言:javascript
运行
复制
print( o1 == o0 )

将打印false,因为o0和o1是两个独立的对象。

然而,如果我们比较一个属性

代码语言:javascript
运行
复制
print( o0.text == o1.text )

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

沿着同样的思路,在领域3.8之后,我相信您无法测试两个对象是否相同,如果没有主键,就使用相等的方法。看看这个

代码语言:javascript
运行
复制
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添加主键

代码语言:javascript
运行
复制
class ObjectClass: Object {
    @objc dynamic var object_id = UUID().uuidString
    @objc dynamic var order = 0

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

然后再次运行代码,它们都会打印true。

代码语言:javascript
运行
复制
print( o1 == o0 ) //prints true  
print( o1.isSameObject(as: o0) ) //prints true
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62111243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档