swift 泛型 : Custom closure with multiple arguments for filter function

标签 swift generics closures

我有一个缓存数组,可以存储不同类型的对象,如 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/

相关文章:

javascript - 使用闭包对数字求和

javascript - Java lambda 是否等同于 JavaScript 闭包?

closures - 如何命名产生闭包的函数

Swift:如何同步下载?

ios - 有没有办法判断 Dropbox block 上传提交是否成功?

java - 如何在Java中对类及其子类使用泛型?

java - 以参数化类型作为参数返回不同类型对象列表的方法

Swift:有没有办法确保只有特定的类才能创建其他类的对象

ios - Nib 内的 UISwitch 值未更新

c# - 泛型类的构造函数具有无效参数