领域懒惰结果类型擦除

时间:2018-07-10 17:40:37

标签: swift realm lazy-evaluation type-erasure

我正在使用 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,例如AnyGeneratorAnySequence,但恐怕我对类型擦除的了解不足,无法在我的情况下使用它们。

所以我的问题是,如何使用类型擦除来获取函数的更干净的返回类型?


编辑:

我试图将表达式强制转换为AnyRandomAccessCollection,但出现以下错误:

  

类型'LazyFilterCollection<LazyMapCollection<LazyFilterCollection<Results<TrainingEntry>>, Training?>>'不符合协议“ RandomAccessCollection”

我还尝试将其转换为AnyCollectionAnyBidirectionalCollection,但它们都起作用,但是随后我失去了用Int下标的能力,这是我想要的。保持。

0 个答案:

没有答案