为什么可以在 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 中定义 List
和 RealmOptional
属性作为 let
,因为如果它们是 var
并通过本机 setter 重新分配,Realm 不会知道并且会发生坏事。
因为 Realm 可以 处理 setValue(_:forKey:)
,那行得通。
在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 中定义 List
和 RealmOptional
属性作为 let
,因为如果它们是 var
并通过本机 setter 重新分配,Realm 不会知道并且会发生坏事。
因为 Realm 可以 处理 setValue(_:forKey:)
,那行得通。