Swift curried函数的行为与扩展版本不同

时间:2014-09-18 09:20:49

标签: swift currying

我在Swift中有一个curried函数:

func counter(var val: Int)() -> () {
  val++
  println(val)
}

根据this answer,它应该等同于:

func counter(var val: Int) -> (() -> ()) {
  func curryFunc() {
    val++
    println(val)
  }
  return curryFunc
}

但是,当我运行以下代码时:

let x = counter(3)
x()
x()

第一个,我得到44;而对于第二个,我得到45

我使用的是Xcode 6.0.1版本。

1 个答案:

答案 0 :(得分:3)

不同之处在于,在第一个版本中,curried函数的主体是正常的函数实现,而在第二个版本中,有一个闭包。如文档中所述:

  

闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。

在您的情况下,val被捕获,并在连续的呼叫中保留。

附录 - 如果您希望第二个函数的行为与curried一样,则应将参数存储在函数体内声明的变量中:

func counter(val: Int) -> (() -> ()) {
    func curryFunc() {
        var unretainedVal = val
        unretainedVal++
        println(unretainedVal)
    }
    return curryFunc
}

捕获的值val不会更改,因此该函数会保留对其原始值的引用。