Realm 10.15.0版本如何将数据转换为JSON?ListBase移除后旧代码适配
Realm 10.15.0+ 版本对象转JSON适配方案
核心原因
Realm 从 v10.10.0 版本开始正式移除了内部私有类 ListBase,原有 List 类型改为直接实现公开的 RealmCollection 协议,因此基于 ListBase 的判断和扩展全部失效。
调整后完整代码
import RealmSwift extension Object { func toWebServiceRequest() -> [String: AnyObject] { let properties = self.objectSchema.properties.map { $0.name } var dicProps = [String: AnyObject]() for (key, value) in self.dictionaryWithValues(forKeys: properties) { // 适配新版本集合类型判断 if let listValue = value as? any RealmCollection { var resultArray = [AnyObject]() for item in listValue { if let subObj = item as? Object { resultArray.append(subObj.toWebServiceRequest() as AnyObject) } else { resultArray.append(item as AnyObject) } } dicProps[key] = resultArray as AnyObject } else if let subObj = value as? Object { dicProps[key] = subObj.toWebServiceRequest() as AnyObject } else { dicProps[key] = value as AnyObject } } return dicProps } }
低版本Swift兼容方案
如果你的项目使用 Swift 5.6 及更低版本,不支持 any 关键字,可以将集合判断逻辑替换为以下实现:
if let listValue = value as? NSFastEnumeration { var resultArray = [AnyObject]() let iterator = listValue.makeIterator() while let item = iterator.next() { if let subObj = item as? Object { resultArray.append(subObj.toWebServiceRequest() as AnyObject) } else { resultArray.append(item as AnyObject) } } dicProps[key] = resultArray as AnyObject }
优化说明
- 移除了已废弃的
ListBase扩展,使用Realm公开协议做类型判断,兼容性更强 - 去掉了不安全的
unsafeBitCast强制类型转换操作,运行稳定性更高 - 新增支持List存储基础类型(String、Int、Bool等)的转换场景,覆盖范围更广
内容的提问来源于stack exchange,提问作者alejandro hernandez
相关产品推荐
相关产品推荐

