【问题标题】:RealmSwift Cannot cast Results<SomeOjbect> to Results<Object>RealmSwift 无法将 Results<SomeOjbect> 转换为 Results<Object>
【发布时间】:2018-06-15 23:50:15
【问题描述】:

RealmSwift 版本:最新的 master 分支

所以我有一个像这样的领域对象:

import RealmSwift
class SomeObject: Object
{
    @objc dynamic var datetime = ""
    @objc dynamic var city = 0

    convenience init(city: Int, datetime: String)
    {
        self.init()
        self.city = city
        self.datetime = datetime
    }
}

有一个类似的func调用

static func createlineData(from results: Results<Object>?) -> LineChartData

现在我获取一些结果并传递给createLineData

let realm = try! Realm()
let results = realm.objects(SomeObject.self).filter("city = \(city.rawValue)")
let lineData = createlineData(from: results as? Results<Object>)

编译器警告我类型转换总是会失败:

从 Results 转换为不相关的类型 Results 总是失败

我很困惑,因为SomeObject 只是一个子类。我该如何解决?提前致谢。

更新:

我想做的是,参数

static func createlineData(from results: Results&lt;Object&gt;?) -&gt; LineChartData

永远无法更改,因此我需要根据枚举的city 进行查询以进行过滤,将它们传递给createlineData(from results: Results&lt;Object&gt;?),并稍后在createlineData 中访问其他属性,例如createlineData,来自@987654331 @

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    在 Swift 中,每个泛型类都代表它自己的类型,即使您有一个泛型类,其中泛型类型参数是另一个泛型类的子类,并且以超类作为其泛型参数,这两个泛型类也不会是通过继承相关。

    这就是为什么即使SomeObjectObject 的子类,您也不能将Results&lt;SomeObject&gt; 转换为Results&lt;Object&gt;

    下面是一个简单的例子,代表了泛型类的相同问题:

    class A{}
    class B:A{}
    
    class GenericClass<T> {
        let val:T
    
        init(val:T) {
            self.val = val
        }
    }
    
    let genericA = GenericClass<A>(val: A())
    let genericB = GenericClass<B>(val: B())
    
    let upcasted = genericB as? GenericClass<A> //warning: Cast from 'GenericClass<B>' to unrelated type 'GenericClass<A>' always fails
    

    此外,Realm 中的Results 类型是同质集合类型,因此您不能将Object 的不同子类存储在同一个Results 对象中,因此无论如何转换为Results&lt;Object&gt; 是没有意义的.如果您需要将来自不同 Realm 模型类的对象存储在同一个集合中,您将需要牺牲 Results 的自我更新特性,并坚持将对象存储在 Array 中。

    【讨论】:

    • 谢谢。那么在我的情况下,如果我的结果是对象类型(不使用SomeObject.self),我可以使用像 objectForKeyPath 这样的 KVC 来访问该属性吗?像let r = Results&lt;Object&gt;[0]let city = r["city"] 之类的?如果是这样,请更新您的答案,我会接受。您的答案仍然需要解决方法或解决方案。我可以不使用SomeObject,但我想保持自我更新,这就是我坚持使用 Realm 的全部原因。
    • 你真正想要达到什么目的?您没有在问题中指定这一点,因此我的回答中缺少解决方法...您不能拥有Results&lt;Object&gt;,因为正如我所说,您无法使用单个.objects 调用从Realm 查询所有对象,因为Results 只能保存单个类的实例,而不能是Object,所以不,您在评论中提出的建议不起作用。在不知道您需要准确实现什么的情况下,我可以建议的唯一解决方法(实际上在我的回答中已经说明)是使用 Array 而不是 Results
    • 查看我更新的 Q。基本上我需要根据city 进行查询以进行过滤,将结果作为 Result 传递,并在 Result 中访问 datetime 等其他属性在那个函数中。
    • 好吧,正如我已经多次声明的那样,Results&lt;Object&gt; is not a valid type, so you cannot do that, you'll have to use an Array` 并放弃Results 的自我更新属性。但是,据我所知,您似乎实际上正在寻找一个通用函数static func createlineData&lt;T&gt;(from results: Results&lt;T&gt;?) -&gt; LineChartData,而不是您目前所拥有的。如果你真的想从几种类型中制作图表,那么你需要考虑你是否真的需要Results的自我更新属性。
    • stackoverflow.com/questions/48127765/… 这是新的 Q。我不介意更改框架本身以使其更好。它只是闻到框架没有按照您所说的设计正确的 API 来使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2014-02-27
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    相关资源
    最近更新 更多