Realm依靠动态调度来访问某些KVC机制的ObjectiveC运行时。模型属性应使用dynamic
关键字标记,以启用Realm
个对象使用的KVC以使用精确值填充它们。所以你可以像这样定义模型:
class Car: Object {
dynamic var color = ""
dynamic var age = 0
}
在某种程度上,您可以设置如下属性:
var car = Car()
car["color"] = "white"
car["age"] = 20
这适用于所有基本类型,例如Int
或String
但不适用于泛型类和结构,因为它们无法在Objective C中表示.Ereal使用两个那些类型:
List<T>
RealmOptional<T>
将这些类型的属性添加到Realm模型时,可以添加它们而不使用动态关键字:
let cars = List<Car>
let registration = RealmOptional<String>
Realm使用什么机制来设置和读取这些类型的数据而不使用动态调度?
更新1
经过一番检查,我发现Realm使用了一些Objective C运行时方法,如class_copyPropertyList()
和property_getName()
,用于内省属性名称。我还没有发现当您从Realm读取数据时,如何使用正确的数据填充属性?那是ObjectStore
C ++框架的一部分吗?
答案 0 :(得分:1)
诸如List<T>
或RealmOptional<T>
之类的通用属性无法从Objective-C中显示出来。 Realm使用Swift的反射(Mirror()
)来检查它们。
然后直接访问他们的ivar
:https://github.com/realm/realm-cocoa/blob/76d1018b32ba98babce31afbefd31863075cde8c/Realm/RLMObjectSchema.mm#L217-L223
静态调度这些通用属性。 Realm无法访问那些。这就是为什么必须将这些属性声明为let
的原因。领域无法看到重新分配属性。