我有一个当前定义为的函数:
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'只能用作通用约束,因为它具有Self或关联类型要求
答案 0 :(得分:3)
这是橡皮擦的类型。在这种情况下,您正在寻找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。