gpt4 book ai didi

swift - 理解 RealmSwift 中的平等

转载 作者:行者123 更新时间:2023-12-05 01:45:15 26 4
gpt4 key购买 nike

我有一些从 Realm 中获取的 item:

let items = realm.objects(ShoppingListItem.self)
print("\(items.count) items") // 10 items

每个item都有一个subdepartment,每个subdepartment都有一个department:

let departments = items.flatMap({ $0.product?.subdepartment?.department })
print("\(departments.count) departments") // 10 departments

我的目标是从此列表中找到唯一的 Department 对象。预期结果是 4。我这里的标准方法是使用 Set:

let uniqueDepartments1 = Set(departments)
print("\(uniqueDepartments1.count) unique departments via Set") // 9 unique departments via Set - but changes every time!?

我想一定有一些与 Realm 对待平等的方式有关的东西我遗漏了。但是为了检查,我还尝试通过枚举获取唯一的部门:

var uniqueDepartments2 = [Department]()
for department in departments {
if uniqueDepartments2.contains(department) {
continue
}
uniqueDepartments2.append(department)
}
print("\(uniqueDepartments2.count) unique departments via enumeration") // 4 unique departments via enumeration

这确实是预期的结果。

为什么 Set 没有像我预期的那样在这里工作?为什么我每次运行时计数都会发生变化?

编辑 2/27

以下是正在使用的模型:

class ShoppingListItem: Object {
dynamic var product: Product?

convenience init(ingredient: Ingredient) {
self.init()

self.product = ingredient.product
}
}

class Product: Object {
dynamic var productID, subdepartmentID, title: String?
dynamic var subdepartment: Subdepartment?
}

class Department: Object {
dynamic var departmentID, title: String?
}

class Subdepartment: Object {
dynamic var subdepartmentID, departmentID, title: String?
dynamic var department: Department?
}

最佳答案

简而言之:为了使 Object 子类能够正确散列,您当前必须声明一个属性作为主键。

Set 建立在哈希表之上。这意味着它通过首先计算对象的哈希值,将该哈希值映射到哈希表中的桶,然后检查该桶中的每个条目是否与指定对象相等来检查特定对象的存在。

此实现的性质意味着 Set 要在给定类型的对象上正确工作,hashValue 属性和 ==操作者必须遵守特定的规则。特别是,== 返回 true 的任何两个对象必须从它们的 hashValue 属性返回相同的值(不需要反过来;它是对于具有相同 hashValue 的两个不相等对象完全有效)。 hashValue== 的 Realm 实现目前不满足这个标准,除非您的类声明一个属性作为主键。当没有声明主键时,Object 的默认 hashValue 计算将推迟到 -[NSObject hash],它只返回对象在内存中的地址.由于 Object.== 允许两个具有不同地址的对象比较相等,这违反了我上面概述的 hashValue== 之间的关系,导致与 Set 一起使用或作为 Dictionary 的键时出现错误行为。我已经提交了 bug against Realm请求修复 == 的行为以与 hashValue 属性返回的值兼容。

关于swift - 理解 RealmSwift 中的平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42473720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com