第六节 闭包表达式与闭包

2021-01-31  本文已影响0人  天明天

一. 闭包表达式

1. 闭包表达式


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.闭包表达式的简写

3.尾随闭包


func exec (v1:Int,V2:Int,fn:(Int,Int)->Int){
    print(fn(v1+v2))
}

//尾随闭包模式调用: 可以这样写:
exec (v1:10, v2:20){
  $0 + $1
}

这里的意思是:调用这个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 { 0.id <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
上一篇下一篇

猜你喜欢

热点阅读