我有一个当前定义为:
public func mappingsWithElementId(elementId:String) -> [Mapping] {
return _mappings.lazy.map({ $1 }).filter({ $0.elementId == elementId })
}
我想更改它,使其不返回数组,而是返回一个可以迭代的(惰性)对象,即调用方随后可以使用的
CollectionType<Mapping>
对象。现在,我可以使用:
public func mappingsWithElementId(elementId:String) -> LazyFilterCollection<LazyMapCollection<[String:Mapping], Mapping>> {
return _mappings.lazy.map({ $1 }).filter({ $0.elementId == elementId })
}
但这对于我正在尝试做的事情来说过于具体了(这只是告诉调用者它是可以迭代得到
Mapping
s的东西。当我级联更多类似性质的函数时,它只是变得越来越难看。有没有一种方法可以声明我的函数,它只承诺返回可以迭代为
CollectionType<Mapping>
的内容?尝试使用
CollectionType<Mapping>
产生:无法专门化非泛型类型“CollectionType”
试图使用
CollectionType
会给我一个错误:协议“collectionType”只能用作泛型约束,因为它具有自身或关联的类型要求
最佳答案
这就是橡皮擦的用途。在这种情况下,您要查找的是AnyForwardCollection
:
public func mappingsWithElementId(elementId:String) -> AnyForwardCollection<Mapping> {
return AnyForwardCollection(_mappings.lazy.map({ $1 }).filter({ $0.elementId == elementId }))
}
还有很多人。
AnySequence
、AnyRandomAccessCollection
等。如果您喜欢,也可以创建自己的。有关更多信息,请参见A Little Respect for AnySequence。