1.闭包的定义和调用:

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

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

3.尾随闭包:

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

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

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

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

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

5.逃逸闭包:

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

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

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

6.自动闭包:

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

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

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

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. kafka数据组织+集群架构

    1.数据组织: partition:Kafka的topic可以划分成一个或多个partition,每个partition存储着这个topic的一部分数据. partition副本:若一个topic的副 ...

  2. GBDT 算法

    GBDT (Gradient Boosting Decision Tree) 梯度提升迭代决策树.GBDT 也是 Boosting 算法的一种,但是和 AdaBoost 算法不同(AdaBoost 算 ...

  3. NIO原理详解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/CharJay_Lin/article/d ...

  4. 2019/10/22 test T1 题解

    题目描述 给定n个a[i],b[i],求min(x$\in$R){$\sum\limits_{i=1}^{n}$|a[i]*x+b[i]|} 输入格式 第 1行 1个整数 n第 2行 n个整数,第 i ...

  5. flutter ListView 页面滚动组件

    ListView class A scrollable list of widgets arranged linearly. ListView is the most commonly used sc ...

  6. 使用状态文件+vigil 监控系统状态

    vigil 是一个不错的系统可用性报告系统,具有还不错的ui 界面,同时也有通知配置,以下是一个简单的 demo 使用状态文件,以及http body 匹配的模式进行web 应用状态的监控,只是简单的 ...

  7. bash: cd: too many arguments 报错

    路径名或者变量有空格时候,会造成参数太多的错误提示 解决方法:把空格的地方用引号包括起来

  8. GDB十分钟教程【转载于网络爱好者】

    本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友,以及程序爱好者. GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调 ...

  9. Problem 5 素数筛法+并查集

    $des$ 给定一个长度为 $n$ 的正整数序列 ${a_i }$.将 ${1,2,...,n}$ 划分成两个非空集合 $S.T$,使得 $gcd(\prod_{i \in S} a_i, \prod ...

  10. 如何使用git把本地代码上传到github

    Git Bash Here git init git add . git commit -m '说明' git remote add origin https://github.com//.git g ...