Ios RealmSwift无法转换结果<;SomeOjbect>;对结果<;对象>;

Ios RealmSwift无法转换结果<;SomeOjbect>;对结果<;对象>;,ios,swift,realm,Ios,Swift,Realm,RealmSwift版本:最新的主分支 我有一个领域对象,比如: 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

RealmSwift版本:最新的主分支

我有一个领域对象,比如:

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
编译器警告我类型转换将始终失败:

从结果到不相关类型结果的强制转换总是失败的

我很困惑,因为
SomeObject
只是一个子类。我怎样才能修好它?提前谢谢

更新:

我想做的是,这个

static func createlineData(来自结果:结果?->LineChartData


无法更改,因此我需要基于enum的城市对filt进行查询,将其传递到createlineData(来自results:results?),并访问其他属性,如稍后在Swift的createlineData中访问的datetime,每个泛型类都表示自己的类型,即使您有一个泛型类,其中泛型类型参数是另一个泛型类的子类,并将超类作为其泛型参数,这两个泛型类也不会通过继承而相关

这就是为什么即使
SomeObject
Object
的子类,也不能将
Results
强制转换为
Results

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

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
class A{}
B类:A{}
类泛型类{
让瓦尔:T
初始值(val:T){
self.val=val
}
}
让genericA=GenericClass(val:A())
让genericB=GenericClass(val:B())
让upcasted=genericB as?GenericClass//警告:从“GenericClass”转换为不相关类型“GenericClass”总是失败

此外,
领域
中的
结果
类型是一种同质集合类型,因此不能将
对象
的不同子类存储在同一个
结果
对象中,因此强制转换到
结果
无论如何都没有意义。如果需要在同一集合中存储来自不同领域模型类的对象,则需要牺牲
结果的自更新特性,并坚持将对象存储在
数组中,每个泛型类都表示自己的类型,即使您有一个泛型类,其中泛型类型参数是另一个泛型类的子类,并将超类作为其泛型参数,这两个泛型类也不会通过继承而相关

这就是为什么即使
SomeObject
Object
的子类,也不能将
Results
强制转换为
Results

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

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
class A{}
B类:A{}
类泛型类{
让瓦尔:T
初始值(val:T){
self.val=val
}
}
让genericA=GenericClass(val:A())
让genericB=GenericClass(val:B())
让upcasted=genericB as?GenericClass//警告:从“GenericClass”转换为不相关类型“GenericClass”总是失败

此外,
领域
中的
结果
类型是一种同质集合类型,因此不能将
对象
的不同子类存储在同一个
结果
对象中,因此强制转换到
结果
无论如何都没有意义。如果需要在同一集合中存储来自不同领域模型类的对象,则需要牺牲
结果的自更新特性,并坚持将对象存储在
数组中。

谢谢。那么在我的例子中,如果我的结果是对象类型(不使用
SomeObject.self
),我可以使用类似KVC的objectForKeyPath来访问属性吗?比如
让r=Results[0]
让city=r[“city”]
,诸如此类?如果是,请更新您的答案,我将接受。您的答案仍然需要解决方法或解决方案。我可以不使用
SomeObject
,但我想保持自我更新,这就是我坚持使用Realm的所有原因。你到底想实现什么?你在问题中没有具体说明,因此在我的回答中缺乏变通方法。。。您不能有
结果
,因为正如我所说的,您不能使用单个
调用来查询领域中的所有对象。对象
调用,因为
结果
只能包含单个类的实例,而类不能是
对象
,因此,不,您在注释中提出的建议不起作用。在不知道您需要实现什么的情况下,我建议的唯一解决方法(正如我的回答中所述)是使用
数组而不是
结果
。请参阅我更新的Q。基本上我需要根据
城市
查询filt,并将结果作为结果传递,并在该函数的Result中访问其他属性,如
datetime
。正如我已经多次指出的,
Results不是有效的类型,因此您不能这样做,您必须使用
Array`并放弃
Results
的自更新属性。然而,据我所知,似乎您实际上在寻找一个通用函数,
static func createlineData(来自results:results?->LineChartData
,而不是您目前所拥有的函数。如果您真的想从几种类型制作图表,那么您需要考虑是否真的需要
Results
的自更新属性。这是新的问题。我不介意改变框架本身,使其更好。它只是闻起来框架没有根据您所说的设计正确的API。谢谢。那么在我的例子中,如果我的结果是对象类型(不使用
SomeObject.self
),我可以使用类似KVC的objectForKeyPath来访问属性吗?比如
让r=Results[0]
让city=r[“city”]
,诸如此类?如果是,请更新您的答案,我将接受。您的答案仍然需要解决方法或解决方案。我可以不使用
SomeObject
,但是