Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift,将函数UIView.removeFromSuperview用作视图数组上forEach函数的参数_Ios_Swift_Functional Programming - Fatal编程技术网

Ios Swift,将函数UIView.removeFromSuperview用作视图数组上forEach函数的参数

Ios Swift,将函数UIView.removeFromSuperview用作视图数组上forEach函数的参数,ios,swift,functional-programming,Ios,Swift,Functional Programming,我想更改以下代码 let views: [UIView] = [] views.forEach { $0.removeFromSuperview() } 通过另一种方式,我将函数UIView.removeFromSuperview作为参数传递给forEach函数。 类似于 let views: [UIView] = [] views.map { /* transform views to be passed furthe

我想更改以下代码

    let views: [UIView] = []
    views.forEach {
        $0.removeFromSuperview()
    }
通过另一种方式,我将函数
UIView.removeFromSuperview
作为参数传递给forEach函数。 类似于

        let views: [UIView] = []
        views.map {  /* transform views to be passed further */ }
            .forEach(UIView.removeFromSuperview)
有可能吗

更新

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

  • 基于后者,Chris Lattner在一段中提到了一些
    flip
    功能对现有代码的影响

    我对其实施的设想如下

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

    只需在
    $0
    上调用该方法即可:

    views.forEach {
        $0.removeFromSuperview()
    }
    
    (如果愿意,您可以命名参数。)

    但您也可以将其包装成一个方法:

    extension Sequence {
        func onEach(_ invoke: (Iterator.Element) -> () -> Void) {
            self.forEach { invoke($0)() }
        }
    }
    
    这是因为它返回一个具有“顶级”签名的函数


    这里的一个缺点是,您不能包含
    forEach
    上的
    rethrows
    注释,因为
    rethrows
    仅在函数参数本身抛出时适用。

    对于
    调用
    的类型,您不需要额外的
    ->Void
    ,对吗?为什么不干脆
    (Iterator.Element)->()
    并将其称为
    invoke($0)
    ?您可以这样做,因为第一个函数的返回类型不是Void,而是另一个函数。调用
    invoke
    只会生成该函数;“那么你还需要调用它。@康纳读了乔希在本文底部链接到的文章answer@Connor:这里是。未来读者注意:passed,它在实现时将把实例方法从像
    (instance)->(Arg1,Arg2,…)->ReturnType
    那样的curry更改为
    (instance,Arg1,Arg2,…)->ReturnType
    ,类似于Python中传递
    self
    的方式。实施此更改后,
    array.forEach(Class.instanceMethod)
    将成为可能,因为
    instanceMethod
    不接受与以下内容相关的参数(除了隐式
    self
    参数):
    extension Sequence {
        func onEach(_ invoke: (Iterator.Element) -> () -> Void) {
            self.forEach { invoke($0)() }
        }
    }