Realm Swift中非可选Map属性声明报错,如何解决?
Realm Map属性非可选初始化报错问题解答
问题描述
我定义了如下Realm对象,其中包含一个Map类型属性:
class UserModel: Object { @Persisted var uploadMap = Map<String, UploadingModel>() }
其中UploadingModel是另一个Realm对象。运行应用时抛出如下错误:
*** Terminating app due to uncaught exception 'RLMException', reason: 'Map<String, UploadingModel> property 'uploadMap' must be marked as optional.'
但Realm Swift官方文档中有类似非可选初始化的示例,且使用List<UploadingModel>()这类Realm类型时未出现报错。请问为何会抛出该错误,如何避免将该Map属性标记为可选?
原因分析
Realm对List和Map的默认值处理逻辑存在差异:
List是Realm原生支持的集合类型,当你用List<UploadingModel>()初始化时,Realm会自动将其识别为一个空的持久化集合,不需要标记为可选。Map(即RealmDictionary)的初始化逻辑不同:直接用Map<String, UploadingModel>()创建的实例是未关联到Realm的独立对象,Realm无法将其作为持久化的非可选属性存储,因此会报错要求标记为可选。
解决方法(无需标记可选)
不要手动初始化Map,而是让Realm自动为属性创建关联的空集合,修改代码如下:
class UserModel: Object { @Persisted var uploadMap: Map<String, UploadingModel> }
这样声明后,Realm会在UserModel对象创建时自动为uploadMap初始化一个空的、关联到当前Realm实例的Map集合,既不需要标记可选,也能正常完成持久化操作。
内容的提问来源于stack exchange,提问作者MSm
相关产品推荐
相关产品推荐

