在 Realm Swift 对象中声明非可选映射属性时出错

问题描述 投票:0回答:1

我有一个带有地图属性的领域对象:

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>()
并且不会引发错误。

如何避免将其标记为可选以及为什么会引发错误?

ios swift realm realm-mobile-platform
1个回答
0
投票

超级好的问题,这方面的文档有点薄弱。

原因如下

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>()

哎呀 - 这就是你的问题!它必须是可选的,因为它可以在应用程序的其他地方删除!

请注意,在 的情况下,将字符串设置为 nil 会根据需要完全删除映射条目(非可选)

© www.soinside.com 2019 - 2024. All rights reserved.