Swift中的链接方法

时间:2016-03-30 17:59:05

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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) }

答案 1 :(得分:2)

您的地图返回一个Int数组,因此您可以应用任何可以使用点语法在Array<Int>上执行的Array方法。为了包含您自己的方法,请确保以可实现此目的的方式扩展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操作,因为它可能是任何类型的数组。

答案 2 :(得分:0)

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