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
等等。如果您愿意,您也可以创建自己的。有关详细信息,请参阅