Swift閉包1-基本概念

原文連接:http://1199game.com/2016/09/S...c++

引言

  這篇文章開始主要講解Swift中閉包(Closures)的一些知識點。本文是這個系列的第一篇。swift

閉包的基本概念

  閉包的就是匿名函數,別的語言也有相似的概念,在Objective-c中就是block,在c++中就是lambdas表達式。閉包能夠獲取閉包所在的上下文的變量和常量,並在閉包內部使用。在Swift中,全局函數和嵌套函數是特殊的閉包,有3種類型。閉包

  1. 全局閉包:定義在全局,不捕獲外部變量函數

  2. 局部閉包:定義在函數內部,會捕獲函數裏面的變量code

  3. 匿名的閉包表達式:能夠捕獲上下文的變量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關鍵字

  當閉包的實現只有一行代碼的時候,能夠省略return關鍵字。好比在上面的代碼中sorted(by:) 函數的定義明確表示須要閉包返回一個Bool類型的值,同時閉包的實現只有一行代碼,顯然能夠判斷,這一行代碼確定返回一個Bool類型的值,因此return關鍵字能夠直接省略。

簡寫參數名

  swift能夠採用更簡潔的方式來定義參數名,例如採用$0,$1,$2等等來引用閉包的參數,若是採用這種參數,in關鍵字也能夠省略掉,最後閉包表達式能夠很是簡單,以下:

reversedNames = names.sorted(by: { $0 > $1 } )

$0表示第一個參數,$1表示第二個參數。

運算符函數

  還有一種更簡單的表達方式,由於String定義了大於(>)運算符.

reversedNames = names.sorted(by: >)

相關文章
相關標籤/搜索