【问题标题】:Comparing Realm Object List比较领域对象列表
【发布时间】:2017-07-18 11:28:40
【问题描述】:

我想比较 2 个 Realm 对象列表,看看它们是否相同。 这是对象的样子。

class ScheduleRealm: Object {
let scheduleList = List<Schedule>()
}

class Schedule: Object {
dynamic var startTime : Date = Date()
dynamic var endTime : Date = Date()
dynamic var name : String = ""   
}

当我打印 2 列表时:

List<Schedule> (
[0] Schedule {
    startTime = 2017-07-03 16:00:00 +0000;
    endTime = 2017-07-03 18:00:00 +0000;
    name = Weights   Mon, 3 Jul 16:00 120m;
},
[1] Schedule {
    startTime = 2017-07-04 16:00:00 +0000;
    endTime = 2017-07-04 17:30:00 +0000;
    name = Weights   Tue, 4 Jul 16:00 90m;
},
[2] Schedule {
    startTime = 2017-07-10 01:30:00 +0000;
    endTime = 2017-07-10 04:30:00 +0000;
    name = Weights   Mon, 10 Jul 01:30 180m;
}
)
List<Schedule> (
[0] Schedule {
    startTime = 2017-07-03 16:00:00 +0000;
    endTime = 2017-07-03 18:00:00 +0000;
    name = Weights   Mon, 3 Jul 16:00 120m;
},
[1] Schedule {
    startTime = 2017-07-04 16:00:00 +0000;
    endTime = 2017-07-04 17:30:00 +0000;
    name = Weights   Tue, 4 Jul 16:00 90m;
},
[2] Schedule {
    startTime = 2017-07-10 01:30:00 +0000;
    endTime = 2017-07-10 04:30:00 +0000;
    name = Weights   Mon, 10 Jul 01:30 180m;
}
)

我尝试过使用“==”或“isEqual”,但即使列表相同,它仍然会导致错误。 我该怎么做才能查看它们是否彼此相同。

【问题讨论】:

    标签: swift compare realm


    【解决方案1】:

    Realm 会覆盖 == 函数,请参阅 Realm object's Equatable is implementation

    简而言之,您正在比较的两个列表可能被 Realm 认为不相等,因为它们不是 Realm 中的托管列表,或者因为它们存储在不同的 Realm 中。如果是这种情况,您可以通过制作托管列表的非托管副本并将其与其他列表进行比较来规避这种情况。

    【讨论】:

    • 在这种情况下,这仍然是实现公平的推荐方法吗?您能否举例说明您建议如何创建非托管副本?
    • @NSRover 是的,这仍然是推荐的方式。要获取非托管对象,可以使用let unmanagedObject = Object(value: existingObject),所以要获取非托管List,可以使用let unmanagedList = List&lt;YourObjectType&gt;(); unmanagedList.append(contentsOf: managedList.map{Object(value: $0)})