闭包也是swift这个语言简洁性的体现,就像在oc中block这个灵活,简洁一样,很重要。
闭包就是个匿名函数,看了看在实际的使用中,和oc的block是一样的,像传个值什么的
完全形态差不多就这个样子
let 闭包名字:(传参类型)->返回类型 = {(传参) -> 返回类型 in
执行代码
return 返回值
}
闭包的形式 有三种
1. 全局函数
有名字但不能捕获任何值
2. 嵌套函数
有名字,也能捕获封闭函数值
3. 闭包表达式
无名闭包,使用轻量级语法,可以根据上下文环境捕获值
Swift中的闭包有很多优化的地方:
- 根据上下文推断参数和返回值类型
- 从单行表达式闭包中隐式返回(也就是闭包体只有一行代码,可以省略return)
- 可以使用简化参数名,如$0,$1(从0开始,表示第i个参数...)
- 提供了尾随闭包语法(Trailing closure Syntax)
闭包是引用类型的。
闭包的创建、赋值、调用
闭包表达式语法能够使用常量形式参数、变量形式参数和输入输出形式参数,但不能提供默认值。可变形式参数也能使用,但需要在形式参数列表的最后面使用。元组也可被用来作为形式参数和返回类型。在闭包的中会用到一个关键字in,in 可以看做是一个分割符,他把该闭包的类型和闭包的函数体分开,in前面是该闭包的类型,in后面是具体闭包调用时保存的需要执行的代码。表示该闭包的形式参数类型和返回类型定义已经完成,并且闭包的函数体即将开始执行。这里总结了一下可能用到的几种形式实现闭包的创建、赋值、调用的过程。例子如下:
方式一:利用typealias最完整的创建
//为(_ num1: Int,_ num2: Int) -> (Int) 类型的闭包定义别名:Add typealias Add = (_ num1: Int,_ num2: Int) -> (Int) //创建一个 Add 类型的闭包常量:addCloser1 let addCloser1: Add //为已经创建好的常量 addCloser1 赋值 addCloser1 = { (_ num1: Int,_ num2: Int) -> (Int) in returnnum1 + num2 } //调用闭包并接受返回值 let result = addCloser1(20,10)
形式二:闭包类型申明和变量的创建合并在一起
//创建一个 (_ num1: Int,_ num2: Int) -> (Int) 类型的闭包常量:addCloser1 let addCloser1: (_ num1: Int,_ num2: Int) -> (Int) //为已经创建好的常量 addCloser1 赋值 addCloser1 = { (_ num1: Int,_ num2: Int) -> (Int) in returnnum1 + num2 } //调用闭包并接受返回值 let result = addCloser1(20,宋体; line-height:25.2px"> 形式三:省略闭包接收的形参、省略闭包体中返回值
//创建一个 (Int,Int) -> (Int) 类型的闭包常量:addCloser1 let addCloser1: (Int,Int) -> (Int) //为已经创建好的常量 addCloser1 赋值 addCloser1 = { (num1,num2) in returnnum1 + num2 } //调用闭包并接受返回值 let result = addCloser1(20,宋体; line-height:25.2px"> 形式四:在形式三的基础上进一步精简
//创建一个 (Int,Int) -> (Int) 类型的闭包常量:addCloser1 并赋值 let addCloser1: (Int,Int) -> (Int) = { (num1,num2) in returnnum1 + num2 } //调用闭包并接受返回值 let result = addCloser1(20,10)形式五:如果闭包没有接收参数省略in
//创建一个 () -> (String) 类型的闭包常量:addCloser1 并赋值 let addCloser1: () -> (String) = { return"这个闭包没有参数,但是有返回值" } //调用闭包并接受返回值 let result = addCloser1()