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

如何将Realm过滤后的Results<SomeObject>传入需Results<Object>的函数?

解决RealmSwift中Results无法转换为Results的问题

我之前也碰到过和你一模一样的问题——用Realm查询子类模型得到的Results<SomeObject>,死活传不进ChartsRealm要求Results<Object>的构造函数里。下面给你几个可行的解决思路:

方案一:利用Swift与Objective-C的桥接特性绕开类型限制

因为ChartsRealm本身支持Objective-C的RLMResults,我们可以先把Swift的Results<SomeObject>转成Objective-C的RLMResults,再转回来成Results<Object>,这样就能绕过Swift泛型不变性的限制:

// 先获取过滤后的Results<SomeObject>
let filteredResults = realm.objects(SomeObject.self).filter("city=0")
// 桥接到RLMResults再转成Results<Object>
let compatibleResults = filteredResults as RLMResults as Results<Object>
// 直接传入构造函数即可
let chartDataSet = RealmChartDataSet(results: compatibleResults, xValueField: "datetime", yValueField: "city", label: "城市数据")

这个方法不用改任何框架代码,而且因为Results<T>底层和RLMResults是兼容的,转换过程是安全的。

方案二:给Results写个类型转换扩展

如果觉得每次写桥接代码麻烦,可以给Results加个扩展,封装类型转换逻辑:

extension Results {
    func toObjectResults() -> Results<Object> {
        // 因为我们明确知道当前Results的元素是Object的子类,所以强制转换是安全的
        return self as! Results<Object>
    }
}

之后使用起来就简单多了:

let filteredResults = realm.objects(SomeObject.self).filter("city=0")
let compatibleResults = filteredResults.toObjectResults()

注意:这个方法只适用于你的模型确实继承自Object的情况,不然会触发运行时崩溃。

方案三:修改ChartsRealm框架的构造函数(推荐长期解决)

如果上面的临时方案都不能满足你的需求,或者你想从根源解决这个问题,完全可以给框架提交PR,把构造函数改成泛型版本:

把原来的构造函数:

public convenience init(results: Results<Object>?, xValueField: String?, yValueField: String, label: String?)

修改为支持泛型的版本:

public convenience init<T: Object>(results: Results<T>?, xValueField: String?, yValueField: String, label: String?)

这样不管是Results<SomeObject>还是其他Object子类的查询结果,都能直接传入构造函数,不需要任何转换。而且这个修改不会影响Objective-C的兼容性——框架原来的Objective-C方法依然可以正常工作。

修改后直接使用的代码:

let filteredResults = realm.objects(SomeObject.self).filter("city=0")
let chartDataSet = RealmChartDataSet(results: filteredResults, xValueField: "datetime", yValueField: "city", label: "城市数据")

内容的提问来源于stack exchange,提问作者Wingzero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:23:38