Update
This commit is contained in:
@ -17,8 +17,8 @@
|
|||||||
Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下:
|
Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下:
|
||||||
|
|
||||||
* 利用上下文推断参数和返回值类型
|
* 利用上下文推断参数和返回值类型
|
||||||
* 对于单表达式闭包可以不写return
|
* 单表达式闭包可以省略 `return` 关键字
|
||||||
* 简单的参数命名
|
* 参数名称缩写
|
||||||
* Trailing 闭包语法
|
* Trailing 闭包语法
|
||||||
|
|
||||||
### 闭包表达式
|
### 闭包表达式
|
||||||
@ -85,6 +85,41 @@ reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )
|
|||||||
|
|
||||||
这说明 `sort` 函数的整体调用保持不变,已对圆括号仍然包裹住了函数中整个参数集合。而其中一个参数现在变成了内联闭包(相比于 `backwards` 版本的代码)。
|
这说明 `sort` 函数的整体调用保持不变,已对圆括号仍然包裹住了函数中整个参数集合。而其中一个参数现在变成了内联闭包(相比于 `backwards` 版本的代码)。
|
||||||
|
|
||||||
|
##### 根据上下文推断类型
|
||||||
|
|
||||||
|
因为排序闭包是作为函数的参数进行传入的,Swift可以推断其参数和返回值的类型。`sort` 期望第二个参数是类型为 `(String, String) -> Bool` 的函数,因此实际上 `String`, `String` 和 `Bool` 类型并不需要作为闭包表达式定义中的一部分。因为所有的类型都可以被正确推断,返回箭头 (->) 和 围绕在参数周围的括号也可以被省略:
|
||||||
|
|
||||||
|
```
|
||||||
|
reversed = sort(names, { s1, s2 in return s1 > s2 } )
|
||||||
|
```
|
||||||
|
|
||||||
|
实际上任何情况下,通过内联闭包表达式构造的闭包作为参数传递给函数时,都可以推断出闭包的参数和返回值类型,这意味着您几乎不需要利用完整格式构造一个内联闭包。
|
||||||
|
|
||||||
|
##### 单行表达式闭包可以省略 `return`
|
||||||
|
|
||||||
|
单行表达式闭包可以通过隐藏 `return` 关键字来隐式返回单行表达式的结果,如上版本的例子可以改写为:
|
||||||
|
|
||||||
|
```
|
||||||
|
reversed = sort(names, { s1, s2 in s1 > s2 } )
|
||||||
|
```
|
||||||
|
|
||||||
|
在这个例子中,`sort` 函数的第二个参数函数类型明确了闭包必须返回一个 **Bool** 类型值。因为闭包函数体只包含了一个单一表达式 (s1 > s2),该表达式返回 **Bool** 类型值,因此这里没有歧义,`return`关键字可以省略。
|
||||||
|
|
||||||
|
##### 参数名称缩写
|
||||||
|
|
||||||
|
Swift 自动为内联函数提供了参数名称缩写功能,您可以直接通过 `$0`,`$1`,`$2` 来顺序调用闭包的参数。
|
||||||
|
|
||||||
|
如果您在闭包表达式中使用参数名称缩写,您可以在闭包参数列表中省略对其的定义,并且对应参数名称缩写的类型会通过函数类型进行推断。`in` 关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成:
|
||||||
|
|
||||||
|
```
|
||||||
|
reversed = sort(names, { $0 > $1 } )
|
||||||
|
```
|
||||||
|
|
||||||
|
在这个例子中,`$0` 和 `$1` 表示闭包中第一个和第二个 **String** 类型的参数。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user