为什么可以在 Realm 中重新分配 List<T> 属性?

Why is it possible to reassign a List<T> property in Realm?

Realm中,要求将List<T>属性命名为let,如:

class Dog:Object {
    dynamic name = "doggy"
    let mate = List<Dog>()
}

let dog1 = Dog()
dog1.name = "Bark"
let dog2 = Dog()
dog2.name = "Brave"
dog1.mates.append(dog2)

因为 mates 是一个 let 变量。您不能通过

重新分配它
let dog3 = Dog()
dog3.name = "Bright"
dog3.mates.append(dog2)
//dog1.mates = dog3.mates // Cannot assign to property: 'mates' is a 'let' constant

但您可以通过

重新分配它
dog1["mates"] = dog3.mates // works
dog1.setValue(dog3.mates, forKey: "mates") //works

我的问题是为什么 "reassign a let variable" 允许?

Realm 中的所有模型属性在后台都是可变的。但是,通用属性不会生成 objective-c getter 和 setters,因此不能被覆盖,这就是为什么必须在 Realm 中定义 ListRealmOptional 属性作为 let,因为如果它们是 var 并通过本机 setter 重新分配,Realm 不会知道并且会发生坏事。

因为 Realm 可以 处理 setValue(_:forKey:),那行得通。