为什么Realm建议使用“let”声明List <t>属性?

时间:2017-03-22 21:24:53

标签: swift realm

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

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

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

1 个答案:

答案 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>属性的分配。