我有一个缓存数组,可以存储不同类型的对象,如 UIView、UICollectionReuableView 等
var arrCache = [AnyObject]()
我想通过传递自定义闭包来使用内置过滤器函数过滤掉这些特定元素:
private func reusableViewsClosure<T where T: Equatable>(element : AnyObject, type: T) -> Bool {
return element is T ? true : false
}
现在,当我在过滤器函数上调用这个闭包时,我得到一个错误说明
let i = arrCache.filter(reusableViewsClosure(UIView))
//错误:无法将调用结果类型 bool 转换为预期类型 '(@noescape (Anyobject) throws -> Bool)'
只是想知道是否允许为用于内置函数(如 map、flatmap、filter 等)的闭包传递额外参数,因为当我像下面这样调用相同的函数时,它工作得很好:
private func reusableHeaderViewsClosure(element : AnyObject) -> Bool {
return element is UICollectionReusableView ? true : false
}
...
let i = arrCache.filter(reusableHeaderViewsClosure)
最佳答案
目前这种情况的语法如下所示:
let i = arrCache.filter { reusableViewsClosure($0, UIView) }
或更具描述性:
let i = arrCache.filter { object in
return reusableViewsClosure(object, UIView)
}
我更喜欢第一个选项,因为它体积小巧。如果您真的想使用 filer(closure)
语法,您可以创建返回工厂的闭包(函数柯里化(Currying))。
func factory<T where T: Equatable>(type: T.Type) -> (AnyObject -> Bool) {
return { reusableViewsClosure($0, type) }
}
你可以用它来过滤:
let i = arrCache.filter (factory(UICollectionView))
关于 swift 泛型 : Custom closure with multiple arguments for filter function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37606803/