【问题标题】:Chaining methods in SwiftSwift 中的链接方法
【发布时间】:2016-03-30 17:59:05
【问题描述】:

我想编写一个可以链接到 map { } 函数的函数。例如:

let arr = [1,2,3,4,5]
let list = arr.map { $0 * 2 }.applyRuleToSubtractVal(1) // return [1,3,5,7,9]

我如何定义上面的applyRuleToSubtractVal()? (我想做更复杂的事情,不想在地图里面做。)

【问题讨论】:

  • 你不需要在“the”map里面做事情,你可以链接map,比如arr.map { $0 * 2 }.map { do_something_complex($0) }.map { $0 + 1 }

标签: swift functional-programming higher-order-functions map-function


【解决方案1】:

sketchyTech 的回答是正确的,但实际上它只是隐藏了一个事实,即

let list = arr.map { $0 * 2 }.map { $0 - 1 }

被执行——这不是最优的,因为数组被枚举了两次。

你可以用一个枚举来达到同样的效果

let complexClosure = { (i: Int) in
    return i-1
}
let list = arr.map { complexClosure($0 * 2) }

【讨论】:

  • 我认为@sketchyTech 的答案应该是正确的,因为 OP 正在寻找可链接性。你是。但是,正确的优化。对两者都 +1。
【解决方案2】:

您的地图返回一个Int 数组,因此您可以应用任何可以使用点语法对Array<Int> 执行的数组方法。为了包含您自己的方法,请确保您扩展 Array 以使其成为可能,例如

extension Array where Element:IntegerType {
    func applyRuleToSubtractValue(num:Int) -> Array {
        return self.map{$0 - 1}
    }
}

let arr = [1,2,3,4,5]
let list = arr.map{$0 * 2}.applyRuleToSubtractValue(1) // [1, 3, 5, 7, 9]

如果我们在这里不使用协议限制,那么我们将无法执行负 1 操作,因为它可能是任何类型的数组。

【讨论】:

    【解决方案3】:

    您需要扩展 Array 的功能。点运算符调用类或结构的方法。将您自己的功能扩展到 Array 结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      相关资源
      最近更新 更多