属性?-6ren"> 属性?-Realm 关于 to-many relationships 的文档声明其 List属性使用let : class Person: Object { // ... other property-6ren">
gpt4 book ai didi

swift - 为什么 Realm 建议使用 "let"声明 List 属性?

转载 作者:搜寻专家 更新时间:2023-10-31 22:01:41 24 4
gpt4 key购买 nike

Realm 关于 to-many relationships 的文档声明其 List<Dog>属性使用let :

class Person: Object {
// ... other property declarations
let dogs = List<Dog>()
}

为什么这是List<T>使用 let 声明的属性当使用 dynamic var 声明其他 Realm 属性类型时?

最佳答案

List<T>应使用 let 声明属性因为 Realm 无法拦截对这些属性的分配。分配给 List<T> properties 不会导致你的更改被持久化到 Realm 文件中。通过使用 let 声明属性而不是 var您使用 Swift 编译器来检测不会按照您的意图执行的代码。

而不是分配给 List<T>您应该通过属于 RangeReplaceableCollection 的方法改变属性的现有值List<T> 的协议(protocol)符合。

例如,添加一只新狗:

person.dogs.append(lassie)

或者替换现有的狗:

person.dogs.replaceSubrange(0..<person.dogs.count, with: [fido, spot])

为什么?

Realm 模型类自动为访问底层数据库数据的持久属性实现 getter 和 setter。为了提供这些 getter 和 setter,您的属性必须使用 dynamic 声明。修饰符。这个修饰符要求 Swift 通过 getter 和 setter 动态分配对属性的访问,而不是在编译时直接访问成员。 dynamic修饰符有一个重要的限制:它只支持可以在 Objective-C 中表示的类型。这是因为 Swift 的动态调度是建立在 Objective-C 运行时之上的。正是这种限制阻止了 Realm 拦截对 List<T> 的分配。属性。

关于swift - 为什么 Realm 建议使用 "let"声明 List<T> 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42962926/

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