我试图了解传递给方法的参数如何用于嵌套闭包。我很紧张,我写的东西不会总是有原始参数。
(这些是极其简化的例子)
我有一个我写的方法,它指定一个闭包作为参数:
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参数?我很确定这个功能全部被保留,而它所称的任何内容都已完成,但我会喜欢第二个意见。
答案 0 :(得分:3)
你是对的,捕获的变量将持续闭合的生命周期。这是从苹果的快速文档中捕获变量的一个重点:
闭包可以从周围捕获常量和变量 定义它的上下文。然后关闭可以参考和 从其中修改这些常量和变量的值 正文,即使是定义常量的原始范围 变量不再存在。
在Swift中,可以捕获值的最简单形式的闭包是一个 嵌套函数,写在另一个函数体内。一个嵌套的 函数可以捕获它的任何外部函数的参数 还捕获外部定义的任何常量和变量 功能