Swift中如何在Realm类中存储多维字符串[[String]]?
问题根源与解决方案
你遇到的问题本质是两个核心矛盾:
- Realm的
List<T>仅支持单层集合存储,无法直接映射JSON中的嵌套数组[[String]]; Decodable协议默认无法将二维数组解析为List<String>,类型不匹配触发了解析错误。
下面是两种在Realm中存储[[String]]类型的通用方案,按需选择:
方案一:序列化为Data存储(简单快捷)
适合不需要对嵌套数组内元素做Realm查询的场景,将二维数组转成Data存储,通过计算属性对外暴露[[String]]?类型:
import RealmSwift class Categories: Object, Decodable { // Realm支持的Data类型,存储序列化后的二维数组 @Persisted private var assetSumData: Data? // 对外暴露的计算属性,自动完成序列化/反序列化 var assetSum: [[String]]? { get { guard let data = assetSumData else { return nil } return try? JSONDecoder().decode([[String]].self, from: data) } set { guard let newValue = newValue else { assetSumData = nil return } assetSumData = try? JSONEncoder().encode(newValue) } } // Decodable协议实现 enum CodingKeys: String, CodingKey { case assetSum } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.assetSum = try container.decodeIfPresent([[String]].self, forKey: .assetSum) super.init() } // Realm Object必须的空初始化方法 required init() { super.init() } }
方案二:创建嵌套Realm Object(支持查询)
如果需要对二维数组内的元素做Realm查询,可将内层数组封装为独立的Realm Object子类:
import RealmSwift // 封装内层[String]的Realm Object class StringArrayObject: Object { @Persisted var items: List<String> = List() // 便利初始化,直接从[String]创建对象 convenience init(array: [String]) { self.init() items.append(objectsIn: array) } // Realm Object必须的空初始化方法 required init() { super.init() } } // 主Categories类 class Categories: Object, Decodable { @Persisted var assetSum: List<StringArrayObject> = List() enum CodingKeys: String, CodingKey { case assetSum } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) // 解码JSON中的[[String]] let nestedArrays = try container.decodeIfPresent([[String]].self, forKey: .assetSum) ?? [] // 转换为StringArrayObject并添加到List nestedArrays.forEach { array in assetSum.append(StringArrayObject(array: array)) } super.init() } required init() { super.init() } }
方案对比
- 方案一:实现简单,无需额外模型类,但无法对数组内元素做Realm查询,只能整体读取后处理;
- 方案二:支持Realm的查询功能(例如查询包含特定字符串的内层数组),但需要多编写一个模型类,代码量稍大。
内容的提问来源于stack exchange,提问作者Dipesh Pokhrel
相关产品推荐
相关产品推荐

