2016-01-21 96 views
0

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

(这些都极大地简化的例子)

我有我写的指定闭包作为参数的方法:

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) 
     } 
    } 

} 

我能够保证的参数(姓名和出生日期)传递到后者本功能离子总是可用?

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

回答

3

你是正确的,捕获的变量将持续关闭的生命。下面是关于捕捉变量的使出从苹果的飞速文档:

闭包可以捕捉常量和变量来自定义它周围 上下文。即使定义常量和 变量的原始范围不再存在,封闭可以参考并从其 正文中修改那些常量和变量的值。

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

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

+0

我必须直通,没有在我的大脑任何坚持它已阅读,谢谢! –