RealmSwift无法将结果<someojbect>转换为结果<object>

时间:2018-01-06 09:19:44

标签: ios swift realm

RealmSwift版本:最新的主分支

所以我有一个Realm对象,如:

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
    }
}

有一个类似

的函数调用
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>)

编译器警告我,类型转换将始终失败:

  

从结果中投射&lt;“SomeObject”&gt;到不相关的类型结果&lt;“对象”&gt;总是失败

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

更新:

我想做的是,

的参数

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

永远无法更改,因此我需要根据枚举city进行过滤,将其传递到createlineData(from results: Results<Object>?),然后在datetime中访问createlineData等其他属性{1}},来自Results<Object>

1 个答案:

答案 0 :(得分:1)

在Swift中,每个泛型类都表示它自己的类型,即使你有一个泛型类,其泛型类型参数是你的另一个泛型类的子类,其中超类作为它的泛型参数,这两个泛型类赢得了&#39;通过继承来关联。

这就是为什么即使Results<SomeObject>Results<Object>的子类,也无法将SomeObject强制转换为Object

这是一个用泛型类表示相同问题的简单示例:

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

此外,Results中的Realm类型是同源集合类型,因此您无法在同一Object对象中存储Results的不同子类,因此强制转换为{ {1}}无论如何都没有意义。如果您需要在同一个集合中存储来自不同Realm模型类的对象,则需要牺牲Results<Object>的自我更新特性,并坚持将对象存储在Results中。