闭包
- 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数
闭包表达式
- 两者的不同,函数要是想省略参数标签,必须要写 “_”, 但是闭包可以不写
闭包表达式的简写
- 第二个函数 fn完全可以写成一个sum函数,因为闭包也能表达函数
- 更魔鬼的写法,1分别代表的就是v1和v2
尾随闭包
- 如果将一个很长的闭包表达式作为函数的最后一个实参,使用尾随闭包可以增强函数的可读性
- 尾随闭包是一个被书写在函数调用括号外面的闭包表达式
- 如果闭包表达式是函数的唯一实参,而且使用了尾随闭包的语法,那么就不需要在函数名后面写圆括号
数组的排序
- 在Swift中数组的排序,直接调用
sort
函数即可
使用闭包表达式来排序
忽略参数
- 闭包表达式和函数一样能够忽略参数, 在Swift中忽略参数可以用下划线"_”代替
闭包
- 网上有各种关于闭包的定义,个人觉得比较严谨的定义是
- 一个函数和它所捕获的常量/变量环境组合起来,称为闭包
- 一般指定义在函数内部的函数
- 一般它捕获的是外层函数的局部变量\常量
- plus是内部函数 num 既是函数捕获的变量,下面的写法和上面等价
- 可以把闭包想象成是一个类的实例对象
- 内存在堆空间
- 捕获的局部变量、常量就是对象的成员(存储属性)
- 组成闭包的函数就是类内部定义的方法
num
就是捕获的局部变量 plus
就是类内部定义的方法
注意
- 如果返回值是函数类型,那么参数的修饰要保持统一,下面参数都是
inout
类型
自动闭包
- 上面的Demo,会进行两次运算,分别执行第一个,和第二个。
- 使用自动闭包
@autoclosure
,如果第一个代码成立,则直接结束,不会执行第二个 -
@autoclosure
会自动将20 封装成闭包{20} -
@autoclosure
只支持()-> T格式的参数 -
@autoclosure
并非只支持最后一个参数 - 空合并预算福 ?? 使用了
@autoclosure
技术 - 有
@autoclosure
无@autoclosure
构成了函数重载 - 使用了
@autoclosure
的值,会延迟执行