closure 增加了Nonescaping Closures没有翻译,Autoclosures部分有改变也没翻译

This commit is contained in:
shanksyang
2015-10-28 15:10:05 +08:00
parent d3c5fbb923
commit 6324910952

View File

@ -8,6 +8,9 @@
> 2.0 > 2.0
> 翻译+校对:[100mango](https://github.com/100mango) > 翻译+校对:[100mango](https://github.com/100mango)
> 2.1
> 校对:[shanks](http://codebuild.me)
本页包含内容: 本页包含内容:
- [闭包表达式Closure Expressions](#closure_expressions) - [闭包表达式Closure Expressions](#closure_expressions)
@ -176,13 +179,13 @@ Swift 的`String`类型定义了关于大于号 (`>`) 的字符串实现,其
reversed = names.sort(>) reversed = names.sort(>)
``` ```
更多关于运算符表达式的内容请查看 [运算符函数](./24_Advanced_Operators.html#operator_functions)。 更多关于运算符表达式的内容请查看 [运算符函数](./25_Advanced_Operators.html#operator_functions)。
<a name="trailing_closures"></a> <a name="trailing_closures"></a>
## 尾随闭包Trailing Closures ## 尾随闭包Trailing Closures
如果您需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。 如果您需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用*尾随闭包*来增强函数的可读性。
尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。 尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。
```swift ```swift
@ -202,16 +205,21 @@ someFunctionThatTakesAClosure() {
``` ```
> 注意: > 注意:
> 如果函数只需要闭包表达式一个参数,当您使用尾随闭包时,您甚至可以把`()`省略掉 >
上例中作为`sorted`函数参数的字符串排序闭包可以改写为: [闭包表达式语法](#closure_expression_syntax)一节中作为`sort(_:)`方法参数的字符串排序闭包可以改写为:
```swift ```swift
reversed = names.sort() { $0 > $1 } reversed = names.sort() { $0 > $1 }
``` ```
如果函数只需要闭包表达式一个参数,当您使用尾随闭包时,您甚至可以把`()`省略掉:
```
reversed = names.sort { $0 > $1 }
```
当闭包非常长以至于不能在一行中进行书写时,尾随闭包变得非常有用。 当闭包非常长以至于不能在一行中进行书写时,尾随闭包变得非常有用。
举例来说Swift 的`Array`类型有一个`map`方法,其获取一个闭包表达式作为其唯一参数。 举例来说Swift 的`Array`类型有一个`map(_:)`方法,其获取一个闭包表达式作为其唯一参数。
数组中的每一个元素调用一次该闭包函数,并返回该元素所映射的值(也可以是不同类型的值)。 数组中的每一个元素调用一次该闭包函数,并返回该元素所映射的值(也可以是不同类型的值)。
具体的映射方式和返回值类型由闭包来指定。 具体的映射方式和返回值类型由闭包来指定。
@ -247,7 +255,7 @@ let strings = numbers.map {
// 其值为 ["OneSix", "FiveEight", "FiveOneZero"] // 其值为 ["OneSix", "FiveEight", "FiveOneZero"]
``` ```
`map`在数组中为每一个元素调用了闭包表达式。 `map(_:)`在数组中为每一个元素调用了闭包表达式。
您不需要指定闭包的输入参数`number`的类型,因为可以通过要映射的数组类型进行推断。 您不需要指定闭包的输入参数`number`的类型,因为可以通过要映射的数组类型进行推断。
闭包`number`参数被声明为一个变量参数(变量的具体描述请参看[常量参数和变量参数](./06_Functions.html#constant_and_variable_parameters)),因此可以在闭包函数体内对其进行修改。闭包表达式制定了返回类型为`String`,以表明存储映射值的新数组类型为`String` 闭包`number`参数被声明为一个变量参数(变量的具体描述请参看[常量参数和变量参数](./06_Functions.html#constant_and_variable_parameters)),因此可以在闭包函数体内对其进行修改。闭包表达式制定了返回类型为`String`,以表明存储映射值的新数组类型为`String`
@ -267,15 +275,15 @@ let strings = numbers.map {
因为其是整数,在计算过程中未除尽部分被忽略。 因为其是整数,在计算过程中未除尽部分被忽略。
因此 16变成了158变成了5510变成了51。 因此 16变成了158变成了5510变成了51。
整个过程重复进行,直到`number /= 10`为0这时闭包会将字符串输出`map`函数则会将字符串添加到所映射的数组中。 整个过程重复进行,直到`number /= 10`为0这时闭包会将字符串输出`map(_:)`函数则会将字符串添加到所映射的数组中。
上例中尾随闭包语法在函数后整洁封装了具体的闭包功能,而不再需要将整个闭包包裹在`map`函数的括号内。 上例中尾随闭包语法在函数后整洁封装了具体的闭包功能,而不再需要将整个闭包包裹在`map(_:)`函数的括号内。
<a name="capturing_values"></a> <a name="capturing_values"></a>
## 捕获值Capturing Values ## 捕获值Capturing Values
闭包可以在其定义的上下文中捕获常量或变量。 闭包可以在其定义的上下文中*捕获*常量或变量。
即使定义这些常量和变量的原域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。 即使定义这些常量和变量的原域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。
Swift最简单的闭包形式是嵌套函数也就是定义在其他函数的函数体内的函数。 Swift最简单的闭包形式是嵌套函数也就是定义在其他函数的函数体内的函数。
@ -343,13 +351,16 @@ incrementByTen()
// 返回的值为30 // 返回的值为30
``` ```
如果您创建了另一个`incrementor`,其会有一个属于自己的独立的`runningTotal`变量的引用 如果您创建了另一个`incrementor`,其会有一个属于自己的独立的`runningTotal`变量的引用
下面的例子中,`incrementBySevne`捕获了一个新的`runningTotal`变量,该变量和`incrementByTen`中捕获的变量没有任何联系:
```swift ```swift
let incrementBySeven = makeIncrementor(forIncrement: 7) let incrementBySeven = makeIncrementor(forIncrement: 7)
incrementBySeven() incrementBySeven()
// 返回的值为7 // 返回的值为7
```
再次调用原来的`incrementByTen`会在原来的变量`runningTotal`上继续增加值,该变量和`incrementByTen`中捕获的变量没有任何联系:
```swift
incrementByTen() incrementByTen()
// 返回的值为40 // 返回的值为40
``` ```