【问题标题】:Higher order function: "Cannot invoke 'map' with an argument list of type '((_) -> _)'"高阶函数:“不能使用 '((_) -> _)' 类型的参数列表调用 'map'”
【发布时间】:2015-02-22 15:30:35
【问题描述】:

我想使用一个快速的高阶函数(map)从给定的 UIView.subviews 数组中删除所有子视图。线

(cell.contentView.subviews as [UIView]).map { $0.removeFromSuperView() }

导致错误 “不能使用类型为 '((_) -> _)' 的参数列表调用 'map'”

我想知道编译器此时需要我做什么。

【问题讨论】:

    标签: swift higher-order-functions


    【解决方案1】:

    我会说地图不适合这种操作。它基于其他序列元素创建一个新序列,但是您不想创建序列,您只想遍历它们并将函数应用于它们。在 swift 中,没有与您想要的匹配的高阶函数,我希望他们能尽快投入一些东西。所以你能做的最好的就是使用 for 循环或编写你自己的函数来做你想做的事情。

    我想建议编写自己的函数(基于 scalas foreach 是什么):

    extension Array {
    
        func foreach(function: T -> ()) {
            for elem in self {
                function(elem)
            }
        }
    }
    

    使用 Swift 2.0 更新

    forEach添加到SequenceType,所以可用:

    (cell.contentView.subviews as [UIView]).forEach { $0.removeFromSuperview() }
    

    【讨论】:

    • 同意。这是对地图的滥用。 Map 不是 for-in 的通用替代品。
    • 好的,同意。在路上的某个地方,我读到不要使用高阶函数来解决它们的副作用。
    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 2020-01-24
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多