原文連接:http://1199game.com/2016/09/S...c++
這篇文章開始主要講解Swift中閉包(Closures)的一些知識點。本文是這個系列的第一篇。swift
閉包的就是匿名函數,別的語言也有相似的概念,在Objective-c中就是block,在c++中就是lambdas表達式。閉包能夠獲取閉包所在的上下文的變量和常量,並在閉包內部使用。在Swift中,全局函數和嵌套函數是特殊的閉包,有3種類型。閉包
全局閉包:定義在全局,不捕獲外部變量函數
局部閉包:定義在函數內部,會捕獲函數裏面的變量code
匿名的閉包表達式:能夠捕獲上下文的變量get
Swift中閉包的定義方式以下。匿名函數
{ (parameters) -> return type in statements }
in關鍵字前面的是閉包的申明部分,相似函數的申明,包括參數的申明和返回值的申明;in後面的部分是閉包的實現。好比swift自帶的array的sort函數,調用sort的時候須要傳一個compare的閉包進去,代碼以下:變量
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 })
上面的sort方法傳入的是一個很標準的閉包表達式,在swift中,閉包表達式能夠更簡單,swift能夠根據上下文推斷出閉包表達式中參數的類型,以及返回值的類型。好比上面的sort函數,傳入的閉包確定是比較array裏面的元素,因此閉包參數的類型確定和array裏面的元素類型同樣(在這裏是String類型),一樣的,做爲比較函數,返回值確定是Bool類型。因此,參數類型和返回值類型均可以根據上下文推斷出來,那麼在閉包裏面就能夠直接省略。更簡介的代碼以下:sed
reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
上面的閉包只須要知道s1和s2就好了,類型能夠推斷出來。同理,返回值也能夠直接省略。lambda
當閉包的實現只有一行代碼的時候,能夠省略return關鍵字。好比在上面的代碼中sorted(by:) 函數的定義明確表示須要閉包返回一個Bool類型的值,同時閉包的實現只有一行代碼,顯然能夠判斷,這一行代碼確定返回一個Bool類型的值,因此return關鍵字能夠直接省略。
swift能夠採用更簡潔的方式來定義參數名,例如採用$0,$1,$2等等來引用閉包的參數,若是採用這種參數,in關鍵字也能夠省略掉,最後閉包表達式能夠很是簡單,以下:
reversedNames = names.sorted(by: { $0 > $1 } )
$0表示第一個參數,$1表示第二個參數。
還有一種更簡單的表達方式,由於String定義了大於(>)運算符.
reversedNames = names.sorted(by: >)