You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:49:54