我正在使用 Realm 作为数据库的 iOS应用,但是我遇到了一个无法在没有您帮助的情况下解决的问题。
我有一个函数可以像这样从我的Realm实例查询对象:
static func trainings(containing exercise: Exercise) -> Results<Training>? {
return Realm.workoutDatabase?.objects(TrainingEntry.self)
.filter({ $0.exercise == exercise })
.compactMap({ $0.training })
}
此代码产生以下错误:
无法将类型为
'LazyMapCollection<LazyFilterCollection<LazyMapCollection<LazyFilterCollection<Results<TrainingEntry>>, Training?>>, Training>?'
的返回表达式转换为类型为'Results?'的结果
显然存在错误,返回类型不应为Results<Training>?
,而应为LazyMapCollection<LazyFilterCollection<LazyMapCollection<LazyFilterCollection<Results<TrainingEntry>>, Training?>>, Training>?
。
Outch!这种类型太长了。
我试图将[Training]?
设置为该函数的返回类型,并且它起作用了。
但是这样做恐怕会隐式将表达式的返回结果强制转换为数组,从而失去集合的懒惰?
据我所知,我需要一个 type-eraser 来获得更短的类型,但我绝对不是该特定领域的专家。
我知道Swift Standard Library provides a few type-erasure structs,例如AnyGenerator
,AnySequence
,但恐怕我对类型擦除的了解不足,无法在我的情况下使用它们。
所以我的问题是,如何使用类型擦除来获取函数的更干净的返回类型?
我试图将表达式强制转换为AnyRandomAccessCollection
,但出现以下错误:
类型
'LazyFilterCollection<LazyMapCollection<LazyFilterCollection<Results<TrainingEntry>>, Training?>>'
不符合协议“ RandomAccessCollection”
我还尝试将其转换为AnyCollection
和AnyBidirectionalCollection
,但它们都起作用,但是随后我失去了用Int
下标的能力,这是我想要的。保持。