我有一个带有地图属性的领域对象:
class UserModel: Object {
@Persisted var uploadMap = Map<String, UploadingModel>()
}
其中 UploadingModel 是另一个领域对象。
运行应用程序后,我收到此错误:
*** Terminating app due to uncaught exception 'RLMException',
reason: 'Map<String, UploadingModel> property
'uploadMap' must be marked as optional.'
在官方文档:realm-swift中有一个示例,可以像上面一样初始化地图,而不将其标记为可选。 另外,我使用其他领域类型,如
List<UploadingModel>()
并且不会引发错误。
如何避免将其标记为可选以及为什么会引发错误?
超级好的问题,这方面的文档有点薄弱。
原因如下
TL;博士
如果Map的值部分是Realm对象,它可以是nil,所以它 必须是可选的
通过示例进行长解释:
从狗类开始,然后是一个将所有狗位置保存为地图的类
class Dog: Object {
@Persisted var name: String
}
class AllDogLocations: Object {
@Persisted var dogLocation = Map<String, Dog?>() //note optional dog here
}
然后说有两只狗被持久化在 Realm、Spot 和 Scraps 中,并且它们被添加到也被持久化的狗位置对象中。 Spot 在俄亥俄州,Scraps 在佛罗里达州
let spotDog = Dog()
spotDog.name = "Spot"
let scrapsDog = Dog()
scrapsDog.name = "Scraps"
let all = AllDogLocations()
all.dogLocation["Ohio"] = spotDog
all.dogLocation["Florida"] = scrapsDog
try! realm.write {
realm.add(all)
}
然后,在应用程序的其他位置,Spot 已从 Realm 中删除
let spotDog = realm.objects(Dog.self).where { $0.name == "Spot" }.first!
try! realm.write {
realm.delete(spotDog)
}
AllDogsLocations 会发生什么?这就是它的样子
AllDogLocations {
dogLocation = Map<string, Dog> <0x600003dd1810> (
[Florida]: Dog {
name = Scraps;
},
[Ohio]: <null>
);
}
注意 Spot,以前位于俄亥俄州,该值为零,因为该对象不再存在。然而,它是地图上的关键,完好无损。
但是,如果要求值(狗)不为 nil,然后将该狗从 Realm 中删除,会发生什么情况
Map<String, Dog>()
哎呀 - 这就是你的问题!它必须是可选的,因为它可以在应用程序的其他地方删除!
请注意,在