闭包是自包含的函数代码块,可以在代码中被传递和使用
闭包可以捕获和存储其所在上下文中的任意常量和变量的引用
Swift 闭包表达式具有简洁的风格,主要的语法优化如下:
- 利用上下文推断参数和返回值类型
- 隐式返回单表达式闭包,就是单表达式闭包可以省略return关键字
- 参数名称缩写
- 尾随闭包语法(Trailing Closure Syntax)
闭包表达式语法
{
(parameters)->ReturnType in
statements
}
闭包表达式的优化过程
Swift 标准库中提供了名为sort的方法对数组进行排序,sort方法接受一个闭包函数作为参数,下面提供通过函数排序的代码:
let numbers = [1,4,3,5,8,7,6,2]
func compare(a:Int,b:Int)->Bool{
return a < b
}
numbers.sort(compare) //numbers = [1,2,3,4,5,6,7,8]
下面把函数换成闭包:
let numbers = [1,4,3,5,8,7,6,2]
numbers.sort({
(a:Int ,b:Int)->Bool in
return a < b
})
//numbers = [1,2,3,4,5,6,7,8]
由于Sort函数可以推断出闭包函数的参数类型和返回值类型为(Int,Int)->Bool,所以闭包表达式可以简化为(语法优化1):
let numbers = [1,4,3,5,8,7,6,2]
numbers.sort({a,b in return a < b})
//numbers = [1,2,3,4,5,6,7,8]
由语法优化2 还可以进一步优化代码:
let numbers = [1,4,3,5,8,7,6,2]
numbers.sort({a,b in a < b})
//numbers = [1,2,3,4,5,6,7,8]
Swift自动为内联函数闭包提供参数缩写功能,可以直接通过 $0,$1,$2... 来顺序调用闭包的参数,如果在闭包表达式中使用参数名称缩写,可以在闭包参数列表中省略对其的定义,并且对应参数名称缩写的类型会通过函数类型进行推断。 in 关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成(语法优化3):
let numbers = [1,4,3,5,8,7,6,2]
numbers.sort({ $0 < $1 })
//numbers = [1,2,3,4,5,6,7,8]
尾随闭包
如果一个函数的最后一个参数是一个闭包函数类型,为了简化代码可以使用尾随闭包,例如:
func functionWithClosure(closure:(Int,Int)->Int){
print(closure(2,3))
}
//调用函数
functionWithClosure(){
return $0 + $1 //打印出 5
}
//如果函数只需要闭包表达式一个参数可以把 () 去掉
functionWithClosure{
$0 + $1 //打印出 5
}
//sort函数也可以写成这样
let numbers = [1,4,3,5,8,7,6,2]
numbers.sort(){ $0 < $1 }
写这篇文章的目的主要是为了巩固一下闭包的知识,因为在实际写代码的时候老是对闭包的语法模糊不清,如有错误之处,还望批评指正。