Swift Generics:具有多个过滤函数参数的自定义闭包

时间:2016-06-03 05:48:31

标签: swift generics closures

我有一个缓存数组,可以存储不同类型的对象,如UIViews,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转换为预期类型&#39;(@ noescape(Anyobject)throws - &gt; Bool)&#39;

只是想知道是否允许传递用于内置函数(如map,flatmap,filter等)的闭包的额外参数,因为当我调用下面这样的相同函数时,它的工作正常:

private func reusableHeaderViewsClosure(element : AnyObject) -> Bool {
    return element is UICollectionReusableView ? true : false
}
...
let i = arrCache.filter(reusableHeaderViewsClosure)

1 个答案:

答案 0 :(得分:1)

此案例的语法如下所示:

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