This commit is contained in:
Wang Hao
2014-06-05 16:49:41 +08:00
parent 29232f25e8
commit 1ae15b1b25

View File

@ -17,8 +17,8 @@
Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下:
* 利用上下文推断参数和返回值类型
* 对于单表达式闭包可以不写return
* 简单的参数命名
* 单表达式闭包可以省略 `return` 关键字
* 参数名称缩写
* Trailing 闭包语法
### 闭包表达式
@ -85,6 +85,41 @@ reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )
这说明 `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** 类型的参数。