如题所述
如果需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。尾随闭包是一个书写在函数括号之后的闭包表达式, 函数支持将其作为最后一个参数调用 ,在使用尾随闭包时,可以不用写出他的参数标签:
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字典获取所映射的字符串。这个闭包能够用于创建任意正整数的字符串表示。