1.闭包的定义和调用:

  1. _ = { (param1: Int, param2: Float, param3: Void) -> return_type in
  2. // 闭包执行代码
  3. /* ... */
  4. }
  1. // 这里声明了一个函数类型的引用指向闭包
  2. // 其类型为:(Int, Int) -> () -> Void
  3. let ref = {
  4. (a: Int, b: Int) -> () -> Void in
  5.  
  6. let sum = a + b
  7. var x = sum *
  8.  
  9. // 这里在一个闭包内定义了一个嵌套闭包,
  10. // 其参数列表为空,返回类型为Void
  11. return {
  12. () -> Void in
  13. // 在此嵌套闭包中捕获了其外部闭包的sum常量
  14. // 以及x变量
  15. print("x = \(x), sum = \(sum)")
  16. x += sum
  17. }
  18. }
    ref(a: 100, b: 200) // x = 600, sum = 300

2.闭包表达式的简略表达:

3.尾随闭包:

“如果一个闭包表达式作为函数调用的最后一个实参,那么我们可以采用尾随闭包(trailing closures)语法糖。当我们采用尾随闭包语法时,如果该函数最后一个形参带有实参标签,那么该实参标签也被省去。”

摘录来自: “大话Swift 4.0”。 iBooks.

  1. func foo(callback: () -> Void) {
  2. callback()
  3. }
  4.  
  5. // 如果一个函数只有一个形参,并且为函数类型,
  6. // 那么我们在使用尾随闭包时连函数调用操作符也可缺省
  7. foo { print("This is a closure") }

我们看到,如果在一个函数调用最后使用了尾随闭包,这个函数调用看上去十分像一个函数定义。所以我们在读代码的时候需要看所调函数之前有没有关键字 func,如果有 func 说明这是一个函数定义,没有则说明是函数调用。

4.捕获局部变量与闭包的执行上下文:

5.逃逸闭包:

“定义了一个函数,它有一个形参为函数类型,如果在此函数中将通过异步的方式调用该函数引用对象,那么我们需要将此函数类型声明为逃逸的(escaping),以表示该函数类型的形参对象将可能在函数调用操作结束后的某一时刻才会被调用。我们要声明一个函数类型的形参为一个逃逸类型非常简单,只需要在类型前加 @escaping 类型说明符即可。”

摘录来自: “大话Swift 4.0”。 iBooks.

  1. // 这里声明了一个隐式拆解的Optional函数引用对象ref,
  2. // 其初始值为空
  3. var ref: (() -> Void)!
  4.  
  5. /// 这里定义了一个函数foo,
  6. /// 它仅有一个形参closure
  7. /// - parameter closure: 类型为:@escaping () -> Void
  8. /// 这里如果不加@escaping类型说明符,那么会出现以下编译报错:
  9. /// 将非逃逸的形参'closure'赋值给一个逃逸的闭包
  10. func foo(closure: @escaping () -> Void) {
  11. // 这里仅仅是将形参closure赋值给我们上面定义的ref函数引用对象
  12. ref = closure
  13. }
  14.  
  15. // 调用foo函数,并给出一个简单的闭包
  16. foo {
  17. print("Hello, world!")
  18. }
  19.  
  20. // 这里是在调用了foo函数之后再通过ref去调用传递给它的闭包对象
  21. […]

6.自动闭包:

“如果一个函数的某个形参为函数类型,并且它不含任何形参,那么我们可以将此参数声明为自动闭包(autoclosure)。如果要将一个形参声明为自动闭包,那么在该形参的类型前加 @autoclosure 类型说明符即可。当一个形参作为一个自动闭包时,我们在调用该函数所传入的实参只需要一个表达式即可,Swift编译器会自动将它封装为一个闭包表达式。”

摘录来自: “大话Swift 4.0”。 iBooks.

  1. // 这里再次定义了函数foo,
  2. // 将它的函数类型的形参声明为自动闭包
  3. func foo(auto closure: @autoclosure () -> Void) {
  4. closure()
  5. }
  6.  
  7. // 我们看到,这里对foo调用时,
  8. // 形参直接就传入了一个函数调用表达式
  9. foo(auto: print("This is a simple lambda!"))
  10.  

Swift4.0复习闭包的更多相关文章

  1. Swift4.0复习特性、编译标志和检查API的可用性

    1.Swift中的特性: @引出,后面紧跟特性名,圆括号带参数即可. @attribute(args) avaiable: 指明对象,函数,类型的可用性. @available(iOS 10.0, m ...

  2. Swift4.0复习控制流语句

    1.do语句块: Swift编程语言中可使用 do 语句块作为类似C语言中的一般语句块进行使用.与C语言的语句块类似,Swift中的 do 语句块单独作为一个作用域,该语句块中声明的局部对象在其外部将 ...

  3. Swift4.0复习访问控制与作用域

    1.访问等级: open: 可以继承,可以重写. public: “public 访问等级能用于修饰所有文件作用域的函数.对象.协议.枚举.结构体.类以及各种类型中的属性与方法.用 public 所修 ...

  4. Swift4.0复习错误处理

    1.Swift中错误的表示: “在Swift中如果我们要定义一个表示错误的类型非常简单,只需遵循 Error 协议即可.我们通常用枚举或结构体类型来表示错误类型,当然枚举可能用得更多些,因为它能更直观 ...

  5. Swift4.0复习扩展

    1.扩展计算式属性: 2.对方法进行扩展: /// 定义枚举类型Light, /// 它指定了基本类型String enum Light: String { case red = "red& ...

  6. Swift4.0复习类型定义、类型投射等操作

    1.类型定义: /// 这里将MyInt定义为Int32类型 typealias MyInt = Int32   /// 这里将MyArrayInt定义为[MyInt]数组类型 typealias M ...

  7. Swift4.0复习类

    1.类的属性: 2.类的方法: 3.类作为引用类型: “Swift新增了一对操作符 === 与 !== 用于判定同一个类的两个对象引用是否指向同一对象实例.” 摘录来自: “大话Swift 4.0”. ...

  8. Swift4.0复习协议

    1.协议的定义: /// 定义一个协议MyProt protocol MyProt {   /// 声明了一个实例方法foo, /// 其类型为:() -> Void func foo()   ...

  9. Swift4.0复习结构体

    1.基本语法: /** 定义了一个结构体 */ struct Structure {   /// 一个常量存储式实例属性, /// 并直接为它初始化 let constProperty =   /// ...

随机推荐

  1. 动手动脑-------找出指定文件夹下所有扩展名为.txt和.java的文件

    思路:首先向获取文件,如果是文件的话,则判断它是否以".txt"或".java"结尾,如果是则输出它的路径.如果是文件夹的话,则需获取子文件,利用递归方法遍历子 ...

  2. 使用对象,面向对象创建div的方式

    <script> // //对象div的创建 // var div = document.createElement("div"); // document.body. ...

  3. js数值的添加与删除

    js中数组元素的添加和删除 js中数组元素常用添加方法是直接添加.push方法以及unshift方法 删除方法则是delete.pop.shift 集修改方法为一身的则是splice 1.添加: (1 ...

  4. 数据库访问优化之四:减少数据库服务器CPU运算

    1.使用绑定变量 绑定变量是指SQL中对变化的值采用变量参数的形式提交,而不是在SQL中直接拼写对应的值. 非绑定变量写法:Select * from employee where id=123456 ...

  5. [golang]A modern, fast and scalable websocket framework with elegant API written in Go

    A modern, fast and scalable websocket framework with elegant API written in Go http://bit.ly/neffos- ...

  6. UOJ#400. 【CTSC2018】暴力写挂 边分治 线段树合并

    原文链接 www.cnblogs.com/zhouzhendong/p/UOJ400.html 前言 老年选手没有码力. 题解 先对第一棵树进行边分治,然后,设点 x 到分治中心的距离为 $D[x]$ ...

  7. 使用IDEA创建一个Maven Web工程:无法创建Java Class文件

    今天用IDEA新建了一个maven web工程,项目目录是这样的: 在新创建一个Java class 文件时,却没有Java class功能,无法创建,如图: 解决方案: 选择 File——>P ...

  8. Vue 中Axios 使用

    1.安装axios npm install axios 2.在使用的地方导入 import axios from 'axios' 3.再方法中调用 sendHttp: function () { ax ...

  9. Java_jdbc 基础笔记之五 数据库连接 (ResultSet)

    /** * ResultSet: 结果集. 封装了使用 JDBC 进行查询的结果. * 1. 调用 Statement 对象的 executeQuery(sql)可以得到结果集. * 2. Resul ...

  10. nginx基础模块

    http://www.nginx.cn/doc/ 基础模块 HTTP Core模块* HTTP Upstream 模块 HTTP Access 模块 HTTP Auth Basic 模块 HTTP A ...