Swift官方文檔閉包(Closure)部分翻譯

最近在學習RxSwift>>>,大量接觸閉包的使用,趁着下班前,翻譯了Swift官方文檔中閉包那常常使用的一部分,看成複習。git

閉包表達式語法

Closure表達式語法具備如下通常形式:github

{ (parameters) -> return type in
        statements
    }
複製代碼

閉包表達式語法中的參數能夠是輸入參數,但它們不能有默認值。若是命名可變參數,可使用變量參數。元組也能夠用做參數類型和返回類型。數組

看一個例子:將一個數組排序。以前的作法是:定義一個方法,傳入數組,返回排序結果。bash

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}
var reversedNames = names.sorted(by: backward)
複製代碼

使用閉包之後:閉包

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
       return s1 > s2
})
複製代碼

因爲閉包的體積很是短,因此它甚至能夠寫在一行上:函數

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )
複製代碼

從上下文推斷類型學習

由於排序閉包做爲參數傳遞給方法,因此Swift能夠推斷它的參數類型和它返回的值的類型。排序後的(by :)方法在字符串數組上調用,因此它的參數必須是類型(String,String) - > Bool的函數。這意味着(String,String)和Bool類型不須要做爲閉包表達式定義的一部分寫入。因爲能夠推斷全部類型,所以也能夠省略返回箭頭( - >)和參數名稱周圍的括號:ui

reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
複製代碼

在將閉包做爲內聯閉包表達式傳遞給函數或方法時,始終能夠推斷參數類型和返回類型。所以,當閉包用做函數或方法參數時,您毫不須要以最充分的形式編寫內聯閉包。this

來自單表達式閉包的隱式返回spa

經過在聲明中省略return關鍵字,單表達式閉包可隱式返回其單個表達式的結果,如前面示例的此版本所示:

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
複製代碼

這裏,排序後的(by :)方法參數的函數類型清楚地代表了閉包必須返回一個Bool值。因爲閉包的主體包含一個返回Bool值的單個表達式(s1> s2),所以不存在歧義,而且能夠省略return關鍵字。

速記參數名稱

Swift自動爲內聯閉包提供速記參數名稱,這些名稱可用於經過名稱0, 1,$ 2等引用閉包參數的值。

reversedNames = names.sorted(by: { $0 > $1 } )
複製代碼

尾隨閉包

若是須要將閉包表達式做爲函數的最終參數傳遞給函數,而且閉包表達式很長,那麼將其做爲尾部閉包編寫可能會頗有用。尾隨閉包在函數調用的括號後面寫入,儘管它仍然是該函數的參數。在使用尾隨閉包語法時,不要將閉包的參數標籤做爲函數調用的一部分寫入。

func someFunctionThatTakesAClosure(closure: () -> Void) {
        // function body goes here
    }

    // Here's how you call this function without using a trailing closure: someFunctionThatTakesAClosure(closure: { // closure's body goes here
    })

    // Here's how you call this function with a trailing closure instead: someFunctionThatTakesAClosure() { // trailing closure's body goes here
    }
複製代碼

上面的Closure Expression Syntax部分中的字符串排序閉包能夠在排序的(by :)方法的括號以外寫爲尾部閉包:

reversedNames = names.sorted() { $0 > $1 }
複製代碼

若是提供閉包表達式做爲函數或方法的惟一參數,而且將該表達式做爲尾隨閉包提供,則在調用該函數時,無需在函數或方法名稱後面編寫一對括號():

reversedNames = names.sorted { $0 > $1 }
複製代碼

當封閉足夠長以致於不可能將它寫在一行上時,尾隨封閉很是有用。做爲一個例子,Swift的數組類型有一個map(_ :)方法,它將一個閉包表達式做爲其單個參數。對於數組中的每一個項目都調用一次閉包,併爲該項目返回一個替代映射值(多是某種其餘類型)。映射的性質和返回值的類型留給閉包來指定。

相關文章
相關標籤/搜索