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>
答案 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
中。