# 闭包
### 什么是闭包
闭包是代码中引用和传递的功能性的独立模块
### 闭包形式:
全局函数是一个有名字但不会捕获任何值的闭包;
内嵌函数是一个有名字且能从其上层函数捕获值的闭包;
闭包表达式是一个轻量级语法所写的可以捕获其上下文中常量或变量值的没有名字的闭包。
### 闭包的优化:
- 利用上下文推断形式参数和返回值的类型;
- 单表达式的闭包可以隐式返回;
- 简写实际参数名;
- 尾随闭包语法
### 闭包表达式语法:
在很简短的一行里面写完的一种语法
{ (parameters) -> (return type) in
statements
}
闭包的函数整体部分由关键字 in 导入,这个关键字表示闭包的形式参数类型和返回类型定义已经完成,并且闭包的函数体即将开始
sorted(by:)://会根据你提供的排序闭包将已知类型的数组的值进行排序,返回新数组
let names = ["Chris","Alex","Ewa","Barry","Daniella"]
func backward(_ s1: String, _ s2: String) -> Bool {
return s1 > s2
}
var reversedNames = names.sorted(by: backward)
// reversedNames is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
提供排序闭包的一个方法是写一个符合其类型需求的普通函数,并将它作为 sorted(by:) 方法的形式参数传入
` reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )`
- 从语境中推断类型:
` reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )`
- 从单表达式闭包隐式返回:
`reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )`
- 简写的实际参数名:Swift 自动对行内闭包提供简写实际参数名,你也可以通过 $0 , $1 , $2 等名字来引用闭包的实际参数值
` reversedNames = names.sorted(by: { $0 > $1 } )`
- 运算符函数简写:Swift 的 String 类型定义了关于大于号( >)的特定字符串实现,让其作为一个有两个 String 类型形式参数的函数并返回一个 Bool 类型的值
`reversedNames = names.sorted(by: >)`
### 尾随闭包:
当需要将一个很长的闭包表达式作为函数最后一个实际参数传递给函数,使用尾随闭包将增强函数的可读性。尾随闭包是一个被书写在函数形式参数的括号外面(后面)的闭包表达式:
` reversedNames = names.sorted() { $0 > $1 }`
如果闭包表达式作为函数的唯一实际参数传入,而你又使用了尾随闭包的语法,那你就不需要在函数名后边写圆括号了:
` reversedNames = names.sorted { $0 > $1 }`
### 捕获值:
一个闭包能够从上下文捕获已被定义的常量和变量。即使定义这些常量和变量的原作用域已经不存在,闭包仍能够在其函数体内引用和修改这些值
### 引用类型闭包:
无论你什么时候安赋值一个函数或者闭包给常量或者变量,你实际上都是将常量和变量设置为对函数和闭包的引用
### 逃逸闭包:
当闭包作为一个实际参数传递给一个函数的时候,我们就说这个闭包逃逸了,因为它可以在函数返回之后被调用。
**使用关键字: \@escaping 明确闭包是逃逸的,使用时,必须显式的引用self**
闭包可以逃逸的一种方法是被储存在定义于函数外的变量里,例如: 多函数接收闭包实际参数来作为启动异步任务的回调。函数在启动任务后返回,但是闭包要直到任务完成——闭包需要逃逸,以便于稍后调用
### 自动闭包:
自动闭包是一种自动创建的用来把作为实际参数传递给函数的表达式打包的闭包。它不接受任何实际参数,并且当它被调用时,它会返回内部打包的表达式的值。这个语法的好处在于通过写普通表达式代替显式闭包而使你省略包围函数形式参数的括号
自动闭包允许你延迟处理,因此闭包内部的代码直到你调用它的时候才会运行
**使用关键字: \@autoclosure 标志标记它的形式参数使用了自动闭包**
Swift3-block闭包
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...