Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何声明返回iterable的函数_Swift_Generics - Fatal编程技术网

Swift 如何声明返回iterable的函数

Swift 如何声明返回iterable的函数,swift,generics,Swift,Generics,我有一个功能,目前定义为: public func mappingsWithElementId(elementId:String) -> [Mapping] { return _mappings.lazy.map({ $1 }).filter({ $0.elementId == elementId }) } 我想对其进行更改,使其只返回一个可以迭代的(惰性)对象,而不是返回一个数组,即调用方可以使用的CollectionType 现在,我可以使用: public func map

我有一个功能,目前定义为:

public func mappingsWithElementId(elementId:String) -> [Mapping] {
    return _mappings.lazy.map({ $1 }).filter({ $0.elementId == elementId })
}
我想对其进行更改,使其只返回一个可以迭代的(惰性)对象,而不是返回一个数组,即调用方可以使用的
CollectionType

现在,我可以使用:

public func mappingsWithElementId(elementId:String) -> LazyFilterCollection<LazyMapCollection<[String:Mapping], Mapping>> {
    return _mappings.lazy.map({ $1 }).filter({ $0.elementId == elementId })
}
public func mappingsWithElementId(elementId:String)->LazyFilterCollection{
返回_mappings.lazy.map({$1}).filter({$0.elementId==elementId})
}
但这对于我试图做的事情来说太过具体了(这只是告诉调用者,它是可以被迭代以获得
映射的东西。当我级联更多类似性质的函数时,它只会变得越来越丑陋

有没有一种方法可以声明我的函数,它只承诺返回可以作为
CollectionType
进行迭代的内容

尝试使用
CollectionType
会产生:

无法专门化非泛型类型“CollectionType”

尝试使用
CollectionType
时出现以下错误:

协议“CollectionType”只能用作一般约束,因为它具有自身或关联的类型要求


这就是类型橡皮擦的用途。在本例中,您正在查找
AnyForwardCollection

public func mappingsWithElementId(elementId:String) -> AnyForwardCollection<Mapping> {
    return AnyForwardCollection(_mappings.lazy.map({ $1 }).filter({ $0.elementId == elementId }))
}
public func mappingsWithElementId(elementId:String)->AnyForwardCollection{
返回AnyForwardCollection(_mappings.lazy.map({$1}).filter({$0.elementId==elementId}))
}
还有许多其他的。
AnySequence
AnyRandomAccessCollection
等等。如果您愿意,您也可以创建自己的。有关详细信息,请参阅