如果需要將壹個很長的閉包表達式作為最後壹個參數傳遞給函數,可以使用尾隨閉包來增強函數的可讀性。尾隨閉包是壹個書寫在函數括號之後的閉包表達式, 函數支持將其作為最後壹個參數調用 ,在使用尾隨閉包時,可以不用寫出他的參數標簽:
func someFunctionThatTakesAClousure(closure:()->void){
//函數體部分
}
以下是不使用尾隨閉包進行函數調用
someFunctionThatTakesAClosure(closure:{
//閉包主體部分
})
以下是使用尾隨閉包進行函數調用
someFunctionThatTakesAClosure(){
//閉包主體部分
}
sorted(by:)方法參數的字符串排序閉包可以改寫為:
reversedNames = names.sorted(){$0>$1}
如果閉包表達式是函數或方法的唯壹參數,則當使用尾隨閉包時,甚至可以把()省略掉
reverseNams = names.sorted{$0>$1}
當閉包非常長以至於不能在壹行中書寫時,尾隨閉包變得非常有用。eg
swift的Array類型有壹個map(_:)方法,這個方法獲取壹個閉包表達式作為其唯壹參數。該閉包函數會為數組中的每壹個元素調用壹次,並返回該元素所映射的值。具體的映射方式和返回值類型由閉包來指定。
當提供給數組的閉包應用於每個數組元素後,map(_:)方法將返回壹個新的數組,**數組中包含了與原數組中的元素壹壹對應的映射後的值。
**
eg 將Int類型數組[16,58,10]轉換為包含對應String類型的值的數組[OneSix,FiveEight,FiveOneZero]
let digitNames = [ 0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four", 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine" ] let numbers = [16, 58, 510]
現在可以通過傳遞壹個尾隨閉包給numbers數組的map(_:)方法來創建對應的字符串版本數組:
let strings = numbers.map{ (number)->String in var number = number var outPut = "" repeat { output = digitNames[number %10]! + output number/=10 }while number>0 return output }
map(_:)為數組中每壹個元素調用了壹次閉包表達式。在本例子中,局部變量number的值由閉包中的number參數獲得,因此可以在閉包函數體內對其進行修改,(閉包或者函數的參數總是常量),閉包表達式指定了返回類型為String,以表明存儲映射值的新數組類型為String。
閉包表達式在每次被調用的時候,創建了壹個叫做output的字符串並返回。其使用求余運算符計算最後壹位數字並利用digitNames字典獲取所映射的字符串。這個閉包能夠用於創建任意正整數的字符串表示。