嵌套闭包中的方法参数

时间:2016-01-21 03:46:17

标签: swift closures

我试图了解传递给方法的参数如何用于嵌套闭包。我很紧张,我写的东西不会总是有原始参数。

(这些是极其简化的例子)

我有一个我写的方法,它指定一个闭包作为参数:

func saveNameAndAgeToServer(serverParams: [String:String], completionHandler: (age: NSNumber) -> ()) {

    // Connect to a server
    // POST a name and dob from serverParams
    // Receives a current age in completion:

    completionHandler(age: 22)
}

现在在其他地方我创建了另一个方法,它还指定了一个闭包,接受两个参数并调用第一个函数:

func AwesomeFunc(name: String, dob: NSDate, completionHandler: (isOverTwentyOne: Bool) -> ()) {

    let formattedDob = NSDateFormatter().stringFromDate(dob)

    saveNameAndAgeToServer([name:formattedDob]) { (age) -> () in

        if (age as Int) >= 21 {

            print("\(name) can have a beer.")
            completionHandler(isOverTwentyOne: true)

        } else {

            print("\(name) is too young to drink, he can have a water.")
            completionHandler(isOverTwentyOne: false)
        }
    }

}

我是否能够保证传递给后一个函数的参数(name和dob)始终可用?

我想问的是,saveNameAndAgeToServer闭包运行的内存是否始终具有AwesomeFunc参数?我很确定这个功能全部被保留,而它所称的任何内容都已完成,但我会喜欢第二个意见。

1 个答案:

答案 0 :(得分:3)

你是对的,捕获的变量将持续闭合的生命周期。这是从苹果的快速文档中捕获变量的一个重点:

  

闭包可以从周围捕获常量和变量   定义它的上下文。然后关闭可以参考和   从其中修改这些常量和变量的值   正文,即使是定义常量的原始范围   变量不再存在。

     

在Swift中,可以捕获值的最简单形式的闭包是一个   嵌套函数,写在另一个函数体内。一个嵌套的   函数可以捕获它的任何外部函数的参数   还捕获外部定义的任何常量和变量   功能

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html