Realm(Swift)存储[String: [String]]类型字典的正确实现方式
问题结论
Realm 不支持直接将 Map<String, List<String>> 作为持久化属性,编译器抛出的 Type 'List<String>' does not conform to protocol 'RealmCollectionValue' 是明确的类型校验提示:Realm 的 Map 集合允许的值类型仅包含基础标量类型、Object 子类、嵌入式对象,不支持直接嵌套 List/Map 这类集合类型。
正确实现方案
要实现 [String: [String]] 结构的存储,需要通过包装嵌入式对象的方式间接实现:
- 定义专门承载字符串数组的嵌入式 Realm 对象
- 将原 Map 的值类型替换为这个嵌入式对象类型
对应实现代码:
import Foundation import RealmSwift // 嵌入式对象,用于包装字符串数组 public class StringListObject: EmbeddedObject { @Persisted public var values: List<String> = List<String>() } public class PersistedUser: Object { public override init() { } @Persisted(primaryKey: true) public var id: UUID? @Persisted public var firstName: String = "" @Persisted public var lastName: String = "" // Map值替换为包装后的嵌入式对象类型 @Persisted public var positions: Map<String, StringListObject> = Map<String, StringListObject>() }
操作示例
读写该属性时,通过包装对象操作内部的字符串数组即可:
let realm = try! Realm() try! realm.write { let user = PersistedUser() // 写入key为"engineer"对应的字符串数组 let engineerList = StringListObject() engineerList.values.append(objectsIn: ["iOS", "Backend", "Frontend"]) user.positions["engineer"] = engineerList // 读取对应key的数组 let targetList = user.positions["engineer"]?.values ?? List<String>() }
注意:不能直接给
positions赋值List<String>类型的值,必须通过StringListObject包装一层,否则会触发类型不匹配的编译错误。如果需要实现字典套字典这类更复杂的嵌套结构,逻辑完全一致,每层集合都用对应的嵌入式对象包装即可。
内容的提问来源于stack exchange,提问作者Brandon Stillitano
相关产品推荐
相关产品推荐

