我在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()
第一个,我得到4
,4
;而对于第二个,我得到4
,5
。
我使用的是Xcode 6.0.1版本。
答案 0 :(得分:3)
不同之处在于,在第一个版本中,curried函数的主体是正常的函数实现,而在第二个版本中,有一个闭包。如文档中所述:
闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。
在您的情况下,val
被捕获,并在连续的呼叫中保留。
附录 - 如果您希望第二个函数的行为与curried一样,则应将参数存储在函数体内声明的变量中:
func counter(val: Int) -> (() -> ()) {
func curryFunc() {
var unretainedVal = val
unretainedVal++
println(unretainedVal)
}
return curryFunc
}
捕获的值val
不会更改,因此该函数会保留对其原始值的引用。