2 回答

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