美文网首页
第六节 闭包表达式与闭包

第六节 闭包表达式与闭包

作者: 天明天 | 来源:发表于2021-01-31 10:42 被阅读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 { 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
    
    • 这里 plus函数跟num 组合 形成闭包。num会被在堆空间开辟内存区域。

      截屏2020-03-03下午6.48.10.png
      这里 函数跟 闭包表达式 跟 num的组合都是闭包,两种写法均可。
    • 我们完全可以将闭包想象成为 一个类的实例对象

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

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


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

    相关文章

      网友评论

          本文标题:第六节 闭包表达式与闭包

          本文链接:https://www.haomeiwen.com/subject/eprbchtx.html