Swift数组.map闭包问题

8
我希望改进我使用Swift的Array.map函数编写的闭包。
基本上,我正在使用闭包对数组进行重新映射所有元素。
// Here's the array:
var numbersArray = [1, 2, 3, 4, 5]

// Here's the closure - it takes whatever number is passed into it and 
// multiplies it by 2.0
var multiplier = {  (currentNum: Int) -> Double in
    let result = Double(currentNum) * 2.0
    return result
}

// And here's how I'm calling it:
var newArray = numbersArray.map(multiplier)

这很完美地实现了功能。

但是如果我想将所有内容乘以2.1?或3.5?或任何值?换句话说,如果我希望将我要乘的数量也成为一个变量呢?并将其作为第二个参数传递到闭包中?

我尝试像这样将其添加到参数列表中:

var multiplier = {  (currentNum: Int, factor: Double) -> Double in
    let result = Double(currentNum) * factor
    return result
}

然后将我的调用更改为:

var newArray = numbersArray.map(multiplier, 3.5)

但是我遇到了各种错误(当然,我已经尝试了各种变化)。

我做错了什么?

2个回答

14

编辑:注:这个语言特性在Swift 2中已被移除。

比Connor的答案更快捷的方法(但沿用同样的思路),是使用一个“柯里化”函数。来自The Swift Programming Language->Language Reference->Declarations->Curried Functions and Methods:

  

以这种方式声明的函数被理解为其返回类型是另一个函数的函数。

因此,您可以简化这个过程:

func multiplier(factor: Double) -> (Int)->Double
{
    return {  (currentNum: Int) -> Double in
        let result = Double(currentNum) * factor
        return result
    }
}

到这个:

func multiplier(factor: Double)(currentNum: Int) -> Double {
    return Double(currentNum) * factor
}

并且要完全按照相同的方式使用它:

let numbersArray = [1, 2, 3, 4, 5]
let multipliedArray = numbersArray.map(multiplier(3.5))

13
你可以使用高阶函数来生成一个自定义函数,然后可以将其与数组的 map 函数一起使用。就像这样:

您可以使用高阶函数来生成自定义函数,然后可以将其与数组的 map 函数一起使用。就像这样:

var numbersArray = [1, 2, 3, 4, 5]

func multiplier(factor: Double) -> (Int)->Double
{
    return {  (currentNum: Int) -> Double in
        let result = Double(currentNum) * factor
        return result
    }
}

var newArray = numbersArray.map(multiplier(2.5))

1
这真是太牛逼了 :-) 非常聪明。这是唯一的方法吗? - sirab333
这是我能想到的唯一方法。虽然我不是函数式编程的专家。 - Connor
好的,即使这不是唯一或“最好”的方法,它肯定很酷。我会为你的正确答案给予赞扬。干杯 :-) - sirab333
不用谦虚,@connor -- 那是很好的函数式编程。 :) 我记得在 Swift 书中可以找到一些类似的例子。 - rickster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接