Swift 中的闭包与C和 Objective-C 中的Blocks以及其他一些编程语言中的lambdas比较相似。
闭包可以捕获和存储其所在上下稳重任意常量和变量的引用,就是所谓的闭合并包裹着这些常量和变量,俗称闭包,Swift会管理捕获过程中涉及到的内存操作。
Swift函数,实际上也是特殊的闭包。
Swift闭包表达式风格简洁,在常见场景中可以实现语法优化:可以利用上下文,推断出参数和返回值的类型,可以省略return关键字。参数名称可以简写。
闭包例子: 使用Swift 提供的函数,sort 为例展示闭包语法优化的方式。 func sort<T>(inout array: [T], isOrderedBefore: (T, T) -> Bool) 第一个参数是一个数组,第二个参数是一个闭包。
let maxs = [1,2,12,123,43,43,64,63]
第一种方式,实现。
func backwards(firstCount:Int, lastCount: Int) ->Bool {
return firstCount > lastCount
}
sort(&maxs, backwards) //第二个参数,传入函数,函数也是特殊的闭包。
// // 第二种方式:使用闭包方式
// // 完整闭包写法是在花括号内有参数列表和返回值,用关键字in表明闭包体的开始
// // (firstCount: Int, lastCount: Int) 闭包参数列表
// // -> Bool 指明闭包返回值类型是Bool
// // in关键字表明闭包体的开始
sort(&maxs, { (firstCount:Int, lastCount: Int) ->Bool in return firstCount < lastCount })
// // 下面再进一步简化写法:根据环境上下文自动推断出类型 // 参数列表都没有指明类型,也没有指明返回值类型,这是因为swift可以根据上下文推测出
// // firstCount和lastCount的类型会是maxs数组元素的可以省略return关键字类型,而返回值类型会根据return语句结果得到
sort(&maxs, { firstCount, lastCountin return firstCount < lastCount})
// // 再进一步简化:隐式返回(单行语句闭包)因为闭包体只有一行代码,可以省略return
sort(&maxs, { firstCount, lastCountin firstCount > lastCount})
// // 再进一步简化:使用简化参数名($i,i=0,1,2...从0开始的)
sort(&maxs, {$1, $2 in $0 > $1 })
// 在进一步简化: // Swift会推断出闭包需要两个参数,类型与maxs数组元素相同
// // 最简单的写法:使用操作符
sort(&maxs, <)