嵌套函數(shù) 是一個在較復雜函數(shù)中方便進行命名和定義自包含代碼模塊的方式。當然,有時候撰寫小巧的沒有完整定義和命名的類函數(shù)結構也是很有用處的,尤其是在您處理一些函數(shù)并需要將另外一些函數(shù)作為該函數(shù)的參數(shù)時。
閉包表達式是一種利用簡潔語法構建內(nèi)聯(lián)閉包的方式。 閉包表達式提供了一些語法優(yōu)化,使得撰寫閉包變得簡單明了。 下面閉包表達式的例子通過使用幾次迭代展示了sort函數(shù)定義和語法優(yōu)化的方式。 每一次迭代都用更簡潔的方式描述了相同的功能。
Swift 標準庫提供了sort函數(shù),會根據(jù)您提供的基于輸出類型排序的閉包函數(shù)將已知類型數(shù)組中的值進行排序。 一旦排序完成,函數(shù)會返回一個與原數(shù)組大小相同的新數(shù)組,該數(shù)組中包含已經(jīng)正確排序的同類型元素。
下面的閉包表達式示例使用sort函數(shù)對一個String類型的數(shù)組進行字母逆序排序,以下是初始數(shù)組值:
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
sort函數(shù)需要傳入兩個參數(shù):
sort函數(shù)當排序結束后傳入的第一個參數(shù)排在第二個參數(shù)前面還是后面。如果第一個參數(shù)值出現(xiàn)在第二個參數(shù)值前面,排序閉包函數(shù)需要返回true,反之返回false。
該例子對一個String類型的數(shù)組進行排序,因此排序閉包函數(shù)類型需為(String, String) -> Bool。
提供排序閉包函數(shù)的一種方式是撰寫一個符合其類型要求的普通函數(shù),并將其作為sort函數(shù)的第二個參數(shù)傳入:
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
var reversed = sort(names, backwards)
// reversed 為 ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
如果第一個字符串 (s1) 大于第二個字符串 (s2),backwards函數(shù)返回true,表示在新的數(shù)組中s1應該出現(xiàn)在s2前。 對于字符串中的字符來說,“大于” 表示 “按照字母順序較晚出現(xiàn)”。 這意味著字母"B"大于字母"A",字符串"Tom"大于字符串"Tim"。 其將進行字母逆序排序,"Barry"將會排在"Alex"之后。
然而,這是一個相當冗長的方式,本質(zhì)上只是寫了一個單表達式函數(shù) (a > b)。 在下面的例子中,利用閉合表達式語法可以更好的構造一個內(nèi)聯(lián)排序閉包。
閉包表達式語法有如下一般形式:
{ (parameters) -> returnType in
statements
}
閉包表達式語法可以使用常量、變量和inout類型作為參數(shù),不提供默認值。 也可以在參數(shù)列表的最后使用可變參數(shù)。 元組也可以作為參數(shù)和返回值。
下面的例子展示了之前backwards函數(shù)對應的閉包表達式版本的代碼:
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)閉包表達式中,函數(shù)和返回值類型都寫在大括號內(nèi),而不是大括號外。
閉包的函數(shù)體部分由關鍵字in引入。 該關鍵字表示閉包的參數(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版本的代碼)。
因為排序閉包函數(shù)是作為sort函數(shù)的參數(shù)進行傳入的,Swift可以推斷其參數(shù)和返回值的類型。 sort期望第二個參數(shù)是類型為(String, String) -> Bool的函數(shù),因此實際上String,String和上一篇:Swift 下標下一篇:Swift ARC自動引用計數(shù)