2 回答

TA貢獻1876條經驗 獲得超7個贊
Swift 標準庫提供了 sort 函數,會根據您提供的排序閉包將已知類型數組中的值進行排序。 一旦排序完成,函數會返回一個與原數組大小相同的新數組,該數組中包含已經正確排序的同類型元素。
下面的閉包表達式示例使用 sort 函數對一個 String 類型的數組進行字母逆序排序,以下是初始數組值:
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
排序函數有兩個參數:
已知類型值的數組。
一個閉包,采用相同類型的數組的內容的兩個參數,并返回一個布爾值來表示是否將第一個值在排序時放到第二個值的前面或是后面。如果第一個值應該出現第二個值之前,閉包需要返回true,否則返回false。
該例子對一個 String 類型的數組進行排序,因此排序閉包需為 (String, String) -> Bool 類型的函數。
提供排序閉包的一種方式是撰寫一個符合其類型要求的普通函數,并將其作為 sort 函數的第二個參數傳入:
func backwards(s1: String, s2: String) -> Bool { return s1 > s2}var reversed = sort(names, backwards)// reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
如果第一個字符串 (s1) 大于第二個字符串 (s2),backwards 函數則返回 true,表示在新的數組中 s1 應該出現在 s2 前。 字符中的 "大于" 表示 "按照字母順序后出現"。 這意味著字母 "B" 大于字母 "A", 字符串 "Tom" 大于字符串 "Tim"。 其將進行字母逆序排序,"Barry" 將會排在 "Alex" 之后,一次類推。
然而,這是一個相當冗長的方式,本質上只是寫了一個單表達式函數 (a > b)。 在下面的例子中,利用閉合表達式語法可以更好的構造一個內聯排序閉包。
閉包表達式語法
閉包表達式語法有如下一般形式:
{ (parameters) -> returnType in statements}
閉包表達式語法可以使用常量、變量和 inout 類型作為參數,但不提供默認值。 也可以在參數列表的最后使用可變參數。元組也可以作為參數和返回值。
下面的例子展示了之前 backwards 函數對應的閉包表達式版本的代碼:
reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2})
需要注意的是內聯閉包參數和返回值類型聲明與 backwards 函數類型聲明相同。 在這兩種方式中,都寫成了 (s1: String, s2: String) -> Bool類型。 然而在內聯閉包表達式中,函數和返回值類型都寫在大括號內,而不是大括號外。
閉包的函數體部分由關鍵字 in 引入。 該關鍵字表示閉包的參數和返回值類型定義已經完成,閉包函數體即將開始。
因為這個閉包的函數體部分如此短以至于可以將其改寫成一行代碼:
reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )
這說明 sort 函數的整體調用保持不變,一對圓括號仍然包裹住了函數中整個參數集合。而其中一個參數現在變成了內聯閉包 (相比于 backwards 版本的代碼)。
- 2 回答
- 0 關注
- 1321 瀏覽
添加回答
舉報