第六节 闭包表达式与闭包

一. 闭包表达式

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 等等

以上所学习的都是闭包表达式


二. 闭包

  1. 定义: 一个函数和她所捕获的变量\常量环境组合起来,就是闭包。
    函数可以通过: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
  • 这里 plus函数跟num 组合 形成闭包。num会被在堆空间开辟内存区域。

    截屏2020-03-03下午6.48.10.png

    这里 函数跟 闭包表达式 跟 num的组合都是闭包,两种写法均可。

  • 我们完全可以将闭包想象成为 一个类的实例对象

  • 内存在 堆空间中,捕获的局部变量、常量 就是对象成员变量、常量

  • 组成闭包的函数就是类内部定义的方法
    可以如下类比:


    截屏2020-03-03下午6.48.10.png

你可能感兴趣的:(第六节 闭包表达式与闭包)