闭包的概念:自包含的函数代码块
闭包的分类: 1.全局函数(有名字),即第四节讲到的函数
2.闭包表达式(匿名),能捕获上下文中的常量或者变量,一般意义上的闭包
3.嵌套函数
1).闭包表达式的语法:
{ (参数) -> 返回值类型 in
执行语句
}
如果没有参数也没有返回值类型,则可以连同关键字“in”一起省略掉:
{
执行语句
}
2).闭包的普遍用法:作为回调函数
例子:
//冒泡排序函数 : 从大到小
func bubbleSort (inout array : [Int]) {
let count = array.count
for _ in 1 ..< count {
for j in 0 ..< count - 1 {
if array[j + 1] > array[j] {
let temp = array[j + 1]
array[j + 1] = array[j]
array[j] = temp
}
}
}
}
var array = [10,11,12,1,4,30]
bubbleSort(&array)
print(array) // [30, 12, 11, 10, 4, 1]
此函数只能按照单一从大到小规则来排序,如果想要有多种规则供选择,则可以使用闭包:
func bubbleSort (inout array : [Int] , compareBlock :(Int ,Int) -> Int) {
let count = array.count
for _ in 0 ..< count - 1 {
for j in 0 ..< count - 1 {
if compareBlock(array[j] , array[j + 1]) > 0 {
let temp = array[j + 1]
array[j + 1] = array[j]
array[j] = temp
}
}
}
}
bubbleSort(&array) { (a : Int , b : Int) -> Int in
if a > b {
return 1
} else {
return -1
}
}
/**
闭包参数类型可优化为 方式1 :{(a , b ) in }
方式2:{ } 完全依靠swift上下文推断
bubbleSort(&array) {
if $0 > $1 {
return 1
} else {
return -1
}
} // $0和$1代表默认参数
*/
3). 闭包表达式的优化
尾随闭包:当闭包表达式作为函数最后一个参数出现时,可以把闭包表达式放在参数的括号外书写:
func sort(inout array : [Int] , block : (Int , Int) -> Int) {
执行语句
}
sort(&array) {
回调语句
}
单表达式的优化:如果闭包内只有一个return语句 则可以省略return:
原:
sort(&array) {
return $0 > $1
}
可简写为:
sort(&array) {
$0 > $1
}
4).嵌套函数
func bubbleSort (inout array : [Int]) {
func swapFunc (a a:Int , b:Int) -> Void {
}
swapFunc(a: 1, b: 2)
}
5).闭包中捕获上下文中的值
func getIncFunc(inc : Int) -> (Int) -> Int {
func incFunc(v : Int) -> Int {
return v + inc
}
return incFunc
}
let incFunc1 = getIncFunc(5)
print(incFunc1(10)) //结果是15
可优化为
func getIncFunc(inc : Int) -> (Int) -> Int {
return {
return $0 + inc
}
}
inc的值被捕获保留了