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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:39:02