我试图理解swift中的闭包。我有以下快速实现:
func whereToGo (ahead:Bool) -> (Int) -> Int{
func goAhead(input:Int) ->Int{
return input + 1 }
func goBack(input:Int) ->Int{
return input - 1 }
return ahead ? goAhead : goBack
}
var stepsToHome = -10
let goHome = whereToGo(ahead: stepsToHome < 0)
while stepsToHome != 0 {
print("steps to home: \(abs(stepsToHome))")
stepsToHome = goHome(stepsToHome)
}
实施的输出如下:
steps to home: 10
steps to home: 9
steps to home: 8
steps to home: 7
steps to home: 6
steps to home: 5
steps to home: 4
steps to home: 3
steps to home: 2
steps to home: 1
我的问题如下:
为什么只执行此闭包:
func goAhead(input:Int) ->Int{
return input + 1 }
为什么这一行没有采用变量值:
提前回来? goAhead:goBack我非常感谢你的帮助,以了解如何快速关闭工作。
答案 0 :(得分:5)
这一行:
runat="server"
是一种更紧凑的说法:
return ahead ? goAhead : goBack
因此,您已将if ahead == true {
return goAhead
} else {
return goBack
}
定义为:
goHome
只要let goHome = whereToGo(ahead: stepsToHome < 0)
小于零,您就会发送TRUE作为stepsToHome
参数。
P.S。这真的与Swift Closures无关......
答案 1 :(得分:4)
whereToGo
是一个函数,它根据输入参数ahead
返回另一个函数。它返回一个函数,该函数接受Int
并返回另一个Int
:(Int) -> Int
。
whereToGo
在其中声明了2个私有函数:goAhead
和goBack
,这些函数根据其输入返回其中一个函数。这两个函数称为nested functions。
这一行ahead ? goAhead : goBack
使用ternary operator来决定返回哪个函数,当true
返回goAhead
时,它会返回goBack
。
下面:
var stepsToHome = -10
let goHome = whereToGo(ahead: stepsToHome < 0)
您正在调用whereToGo
将stepsToHome < 0
作为输入参数,这是一个评估为true
的布尔值。 ==&GT; goHome
现在指的是嵌套的goAhead()
函数==&gt;它将被调用。
您正在迭代while stepsToHome != 0
==&gt;条件stepsToHome < 0
始终为true
==&gt;当您致电goAhead()
时,将始终调用goHome(stepsToHome)
函数。