我有一个当前定义为:

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 })
}

但这对于我正在尝试做的事情来说过于具体了(这只是告诉调用者它是可以迭代得到Mappings的东西。当我级联更多类似性质的函数时,它只是变得越来越难看。
有没有一种方法可以声明我的函数,它只承诺返回可以迭代为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 }))
}

还有很多人。AnySequenceAnyRandomAccessCollection等。如果您喜欢,也可以创建自己的。有关更多信息,请参见A Little Respect for AnySequence

09-30 23:45