2016-02-08 65 views
0

我是iOS World的新手。當我看到下載文件的方法時。我看到這個代碼:Swift:解釋NSURLSession.sharedSession()的語法語法。dataTaskWithURL

 // create url 
     let imageURL = NSURL(string: Constants.CatURL)! 

     // create task 
     let task = NSURLSession.sharedSession().dataTaskWithURL(imageURL) { 
      (data, response, error) in print("task finished") 
     } 

我真的不明白部分:

{ 
     (data, response, error) in print("task finished") 
    } 

dataresponseerror對象從何而來?他們是哪一種?我熟悉一些Java,C#和以上的語言結構非常奇怪:在一個方法調用之後是一個{}的codeblock。我只是看到,在iOS的有兩種方法,從上面非常不同:

let task = NSURLSession.sharedSession().dataTaskWithURL(url: NSURL) 
let task = NSURLSession.sharedSession().dataTaskWithURL(url: NSURL, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) 

謝謝:)

回答

2

{ ... }的東西是一個匿名函數體。 (...) in中的內容是傳遞給函數的參數的名稱。

問題中關於「他們是哪種類型?」的部分是一個非常好的問題。答案是,斯威夫特知道這個聲明,您引用:

let task = NSURLSession.sharedSession().dataTaskWithURL(url: NSURL, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) 

所以斯威夫特已經知道類型的三個參數,從而類型就可以選擇略(在這裏,他們其實已省略) 。

您也可能會因爲遺漏標籤completionHandler:而感到困惑。這是合法的,因爲這個函數是最後的參數。在這種情況下,放棄標籤並將匿名函數體放在函數調用括號之外(稱爲「尾隨語法」)是合法的。

因此,您引用的代碼是實際上是實施dataTaskWithURL(_:completionHandler:)的法律形式。

+0

有關匿名函數聲明語法的更多說明,請訪問:http://www.apeth.com/swiftBook/ch02.html#_anonymous_functions – matt

+0

如果return是'Void'。我們可以省略' - >()'的部分,對吧? –

+0

是的,在這種情況下,我們也可以省略括號並在''中寫入'param,param,param'。再次請看我給你的鏈接。它在那裏,等着你讀它。所以在這個例子中,他們可以寫這個,但他們沒有。 – matt