2016-01-21 39 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

我必須直通,沒有在我的大腦任何堅持它已閱讀,謝謝! –