Swift 閉包表達式

閉包表達式語法有如下的一般形式:

 { (parameters) -> returnType in
     statements
 }

閉包表達式參數(shù) 可以是 in-out 參數(shù),但不能設定默認值。也可以使用具名的可變參數(shù)(但是如果可變參數(shù)不放在參數(shù)列表的最后一位的話,調(diào)用閉包的時時編譯器將報錯。)

  • 舉個例子
var names = ["Jack", "Bob", "Tom", "Alen", "James",]
 var sortedArray = names.sorted(by: { (s1: String, s2: String) -> Bool in 
      return s1 > s2
})

閉包的函數(shù)體部分由關鍵字 in 引入。該關鍵字表示閉包的參數(shù)和返回值類型定義已經(jīng)完成,閉包函數(shù)體即將開始。

簡化之旅

  1. 根據(jù)上下文推斷類型
    因為排序閉包函數(shù)是作為 sorted(by:) 方法的參數(shù)傳入的,Swift 可以推斷其參數(shù)和返回值的類型。 sorted(by:) 方法被一個字符串數(shù)組調(diào)用,因此其參數(shù)必須是 (String, String) -> Bool 類型的函數(shù)。這意味著 (String, String) 和 Bool 類型并不需要作為閉包表達式定義的一部分。因為所有的類型都可以被正確推斷,返回箭頭( -> )和圍繞在參數(shù)周圍的括號也可以被省略:
    reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )

  2. 單表達式閉包隱式返回
    單行表達式閉包可以通過省略 return 關鍵字來隱式返回單行表達式的結(jié)果,如上版本的例子可以改寫為:
    reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

sorted(by:) 方法的參數(shù)類型明確了閉包必須返回一個 Bool 類型值。因為閉包函數(shù)體只包含了一個單一表達式( s1 > s2 ),該表達式返回 Bool 類型值,因此這里沒有歧義, return 關鍵字可以省略。

  1. 參數(shù)名稱縮寫
    Swift 自動為內(nèi)聯(lián)閉包提供了參數(shù)名稱縮寫功能,你可以直接通過 $0 , $1 , $2 來順序調(diào)用閉包的參數(shù),以此類推。
    如果你在閉包表達式中使用參數(shù)名稱縮寫,你可以在閉包定義中省略參數(shù)列表,并且對應參數(shù)名稱縮寫的類型會通過函數(shù)類型進行推斷。in 關鍵字也同樣可以被省略,因為此時閉包表達式完全由閉包函數(shù)體構(gòu)成:
    reversedNames = names.sorted(by: { $0 > $1 } )
    在里的$0$1表示閉包中第一個和第二個 String 類型的參數(shù)。

  2. 運算符方法
    其實還有一種更簡短的方式來編寫上面例子中的閉包表達式。Swift 的 String 類型定義了關于大于號(>)的字符串實現(xiàn),其作為一個函數(shù)接受兩個 String 類型的參數(shù)并返回 Bool 類型的值。而這正好與
    sorted(by:) 方法的參數(shù)需要的函數(shù)類型相符合。因此,你可以簡單地傳遞一個大于號,Swift 可以自動推斷出你想使用大于號的字符串函數(shù)實現(xiàn):
    reversedNames = names.sorted(by: >)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容