第六节 闭包表达式与闭包
2021-01-31 本文已影响0人
天明天
一. 闭包表达式
1. 闭包表达式
- 在
swift
中可以通过func
定义一个函数,也可以通过闭包表达式定义一个函数。
var fun = {
(v1 : Int,v2 :Int) -> Int in
return v1 + v2
}
fun(10,20)
{
(参数列表) -> 返回值类型 in
函数体代码
}
也可以不需要赋值,直接调用
{
(v1:Int , v2:Int) -> Int in
return v1 + v2
}(10,20)
2.闭包表达式的简写
-
小括号 以及参数类型都可以省略
截屏2020-02-28上午10.46.49.png - 继续简写:省略参数,使用
$1
,$2
,$3
...,表示第一个、第二个参数,第三个参数...
截屏2020-02-28上午10.49.18.png
3.尾随闭包
- 如果我们将一个闭包表达式作为函数的
最后一个实参
,使用尾随闭包可以增加函数的可读性。 - 尾随闭包就是一个 书写在函数
调用括号外面(后面)的闭包表达式。
func exec (v1:Int,V2:Int,fn:(Int,Int)->Int){
print(fn(v1+v2))
}
//尾随闭包模式调用: 可以这样写:
exec (v1:10, v2:20){
$0 + $1
}
- 如果闭包表达式 是函数的唯一实参,而且使用了尾随闭包,那就不需要再函数名称后面写
()
。
截屏2020-02-28上午11.03.14.png
这里的意思是:调用这个
exec
函数,并且参数值是一个闭包表达式。
4. 实例 - 数组的排序。
- 数组排序
func testSort(){
var arr = [10,1,20,28,2,3,29]
arr.sort()//默认排序从小到大
arr.sort(by:cmp)//直接传入函数,或者直接传入闭包表达式
// 内部方法
arr.sort(by: {
(v1 : Int, v2:Int) -> bool in
return v1 > v2
})
arr.sort(by:{$0 > $1})
arr.sort(){ $0 > $1 }
arr.sort{ $0 > $1 }//从小到大
arr.sort{ $0 < $1}//从大到小
print(arr)
}
截屏2020-03-03下午5.19.10.png
- 可以用于自定义排序对象
可以在闭包表达式里面自主实现排序方法,比如person 对象的 age 大小排序等等。
对model数组排序
let sortArr0 = persons.sorted { 1.id }
print(sortArr0)
还有需要知道的关于数组的其他闭包表达式
sorted、filter、forEach、flatMap、dropFirst、dropLast 等等
以上所学习的都是闭包表达式
二. 闭包
- 定义: 一个函数和她所捕获的变量\常量环境组合起来,就是闭包。
函数可以通过:func
定义,或者使用闭包表达式定义函数。(这里的函数或者闭包表达式 一般是指 在函数内部的函数。下面的例子就是:plus
函数跟num
的组合就是闭包)
- 一般是指定义在函数内部的函数
- 一般他捕获的是外层函数的局部变量、常量。
typealias Fu = (Int) - > Int
func getFn() -> Fn {
//局部变量,这里会分配堆空间 便于下面的函数捕获他
var num = 0
func plus(_ v1 : Int) ->Int{
num += v1
return num
}
return plus
}
var fn1 = getFn()
print(fn1(1))//1
print(fn1(2))//3
print(fn1(3))//6. 会累加值
// 注意区别
var fn2 = getFn()//又重新开辟了一段堆存空间
print(fn1(1))// 1
print(fn2(2))//2
print(fn1(3))//4 = 1 + 3
print(fn2(4))//6 = 2 + 4
-
这里
截屏2020-03-03下午6.48.10.pngplus
函数跟num
组合 形成闭包。num
会被在堆空间开辟内存区域。
这里 函数跟 闭包表达式 跟 num的组合都是闭包,两种写法均可。 -
我们完全可以将闭包想象成为 一个类的实例对象
-
内存在 堆空间中,捕获的局部变量、常量 就是对象成员变量、常量
-
组成闭包的函数就是类内部定义的方法
可以如下类比:
截屏2020-03-03下午6.48.10.png