Swift,使用函数UIView.removeFromSuperview作为视图数组中forEach函数的参数

时间:2017-12-04 13:38:56

标签: ios swift functional-programming

我想更改以下代码

    let views: [UIView] = []
    views.forEach {
        $0.removeFromSuperview()
    }

以其他方式,我将函数UIView.removeFromSuperview作为参数传递给forEach函数。 类似于

的东西
        let views: [UIView] = []
        views.map {  /* transform views to be passed further */ }
            .forEach(UIView.removeFromSuperview)

有可能吗?

更新

根据下面的答案和一些评论,我可以为自己总结一下这个问题的反馈。

  1. Instance Methods are “Curried” Functions in Swift (By Ole Begemann)
  2. Flattening the function type of unapplied method references (Swift Evolution)
  3. 基于后者,Chris Lattner在段落对现有代码的影响中提到了一些flip函数。

    我对其实施的假设是以下内容

    func flip<T>(_ function: @escaping (T) -> () -> Void) -> (T) -> Void {
        return { object in function(object)() }
    }  
    

    因此,我们可以重写像

    这样的初始代码
    views.forEach(flip(UIView.removeFromSuperview))
    

1 个答案:

答案 0 :(得分:1)

只需在views.forEach { $0.removeFromSuperview() } 上调用该方法即可:

extension Sequence {
    func onEach(_ invoke: (Iterator.Element) -> () -> Void) {
        self.forEach { invoke($0)() }
    }
}

(如果你愿意,你可以命名参数。)

但你也可以把它包装成一个方法:

rethrows

这是因为instance methods can be represented as functions that take an instance of their type并返回一个具有&#34;顶级&#34;的功能。签名。

此处的一个缺点是,您无法在forEach中包含rethrows注释,因为IOperation<?> parameter1 = null; ITotallyDifferentOperation<?> parameter2 = null; 仅适用于函数参数本身正在投掷的情况