2017-08-22 60 views
-1

我想理解快速关闭。我有以下迅速实施: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 

我的问题有以下几点:

  1. 为什么只执行该关闭:

    func goAhead(input:Int) ->Int{ 
        return input + 1 } 
    
  2. 为什么在这条线上没有采取变量值:

    提前回来? goAhead:goBack

我真的很感谢您的帮助,了解如何迅速关闭工作。

+0

您的问题更多地讨论嵌套函数,这是闭包的特例。 –

+0

正如苹果文档所说的 - :嵌套函数是具有名称的闭包,并且可以从其封闭函数捕获值.https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html –

回答

4

这条线:

return ahead ? goAhead : goBack 

是说的更紧凑的方式:

if ahead == true { 
    return goAhead 
} else { 
    return goBack 
} 

所以,既然您已经定义goHome为:

let goHome = whereToGo(ahead: stepsToHome < 0) 

只要stepsToHome是小于零,您发送TRUE作为ahead参数河

P.S.这真的与Swift Closures无关......

3

whereToGo是一个函数,它返回基于输入参数ahead的另一个函数。它返回一个函数,它需要一个Int并返回另一个Int(Int) -> Int

whereToGo声明里面2个私有函数:goAheadgoBack,这些都是它返回基于其输入其中的一个功能。这两个功能被称为nested functions

此行ahead ? goAhead : goBack使用ternary operator决定哪些函数返回,当true返回goAhead,否则返回goBack

这里:

var stepsToHome = -10 
let goHome = whereToGo(ahead: stepsToHome < 0) 

要调用whereToGo给它stepsToHome < 0作为输入参数,它是计算结果为true一个布尔值。 ==>goHome现在指的是嵌套的goAhead()函数==>它将被调用。

而且你迭代while stepsToHome != 0 ==>的条件stepsToHome < 0永远是当你调用goHome(stepsToHome)true ==>goAhead()函数总是被调用。