Realm的to-many relationships文档使用List<Dog>
声明其let
属性:
class Person: Object {
// ... other property declarations
let dogs = List<Dog>()
}
当使用List<T>
声明其他Realm属性类型时,为什么使用let
声明此dynamic var
属性?
答案 0 :(得分:7)
List<T>
声明 let
属性,因为Realm无法拦截对这些属性的赋值。分配给List<T>
属性不会导致您的更改持久保存到Realm文件。通过使用let
而不是var
声明属性,您可以使用Swift编译器来检测不符合您要求的代码。
不应分配给List<T>
属性,而应通过RangeReplaceableCollection
协议中List<T>
协议的一部分方法改变属性的现有值符合。
例如,添加新狗:
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>
属性的分配。