RealmSwift中使用Map存储字典遇赋值后为空,求正确实现方法
在RealmSwift中正确存储字典(使用Map)
问题根源
你遇到的问题是对RealmSwift的Map类型使用方式错误:
Map是Swift专属的值类型容器,不支持dynamic修饰(dynamic用于Objective-C兼容的属性)- 不能将
Map声明为可选类型(?),Realm要求这类容器属性必须有默认值
正确实现方式
1. 修正模型定义
使用@Persisted修饰Map属性,指定键值类型,声明为非可选(Realm会自动初始化空Map):
class Obj1: Object { @Persisted var obj2: Obj2? } class Obj2: Object { @Persisted var obj3: Obj3? } class Obj3: Object { @Persisted var val: String? // 声明为非可选的Map,键为String,值为String @Persisted var valMap = Map<String, String>() }
注意:无需添加
@objcMembers,@Persisted是现代Realm的Swift专属属性包装器,不需要Objective-C兼容
2. 写入数据的正确代码
在写入事务中直接操作Map,无需手动初始化(Realm已自动创建空Map):
try! realm.write { let obj1 = Obj1() obj1.obj2 = Obj2() obj1.obj2?.obj3 = Obj3() obj1.obj2?.obj3?.val = "test" // 直接向valMap添加键值对 obj1.obj2?.obj3?.valMap["testKey"] = "testValue" realm.add(obj1) }
3. 读取数据
读取时可直接访问valMap,它会正确保留存储的键值对:
try! realm.write { guard let requestedObj1 = realm.objects(Obj1.self).first else { return } // 读取valMap中的值 let value = requestedObj1.obj2?.obj3?.valMap["testKey"] print(value) // 输出 "testValue" }
额外说明
- 如果需要存储
Object子类作为Map的值,修改类型声明即可,例如:@Persisted var objectMap = Map<String, CustomObject>()(CustomObject需继承自Object) Map支持的键类型包括:String、Int、Int8、Int16、Int32、Int64、UInt、UInt8、UInt16、UInt32、UInt64、Float、Double、Bool- 所有对
Map的修改必须在Realm写入事务中进行
内容的提问来源于stack exchange,提问作者Gargo
相关产品推荐
相关产品推荐

