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