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

第六节 闭包表达式与闭包

作者: 天明天 | 来源:发表于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

相关文章

  • Day7 闭包(Closures)

    本页包含内容:• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包 1、闭包表达式 闭包...

  • swift 闭包与闭包表达式

    闭包与闭包表达式 在swift里闭包大家都很熟悉,相当于oc中的block。闭包表达式又是啥?很多人把闭包表达式等...

  • 闭包

    闭包 本节内容包括: 闭包表达式 尾随闭包 值捕获 闭包是引用类型 Swift 中的闭包与 C 和 Objecti...

  • Swift基础语法-闭包,闭包函数回调,尾随闭包,闭包捕获值,循

    本节知识点 闭包的基本概念 闭包基本使用 闭包表达式作为回调函数 闭包的多种写法(尾随闭包) 闭包表达式优化 闭包...

  • swift- 闭包一

    /*• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包*/

  • Swift4.2基础学习笔记(十)

    参考资料与链接https://www.cnswift.org 闭包表达式 Sorted方法 闭包表达式语法 闭包表...

  • 07-闭包

    闭包表达式(Closure Expression) 闭包表达式的简写 尾随闭包 示例 - 数组的排序 忽略参数 闭...

  • Swift汇编分析闭包-内存布局

    1、闭包表达式与闭包 闭包表达式也就是定义一个函数。一般我们可以通过func定义一个函数,也可以通过闭包表达式定义...

  • 闭包 Closure

    内容摘要: 闭包介绍 闭包表达式 尾随闭包 值捕获 逃逸闭包 自动闭包 一、闭包介绍 闭包是自包含的函数代码块,可...

  • iOS中Swift从开始入门到最后的放弃(十2),

    #闭包(Closures) 本页包含内容: - 闭包表达式(Closure Expressions) - 尾随闭包...

网友评论

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

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