如何声明一个返回iterable的函数

时间:2016-03-02 23:25:58

标签: swift generics

我有一个当前定义为的函数:

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或关联类型要求

1 个答案:

答案 0 :(得分:3)

这是橡皮擦的类型。在这种情况下,您正在寻找AnyForwardCollection

public func mappingsWithElementId(elementId:String) -> AnyForwardCollection<Mapping> {
    return AnyForwardCollection(_mappings.lazy.map({ $1 }).filter({ $0.elementId == elementId }))
}

还有很多其他人。 AnySequenceAnyRandomAccessCollection等。如果您愿意,也可以创建自己的。有关详情,请参阅A Little Respect for AnySequence