Skip to content

Commit e9905c2

Browse files
committed
Merge pull request #388 from 100mango/patch-4
修订闭包剩余部分
2 parents 5cd6c3a + cf51cad commit e9905c2

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

source/chapter2/07_Closures.md

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -122,26 +122,28 @@ reversed = names.sort( { (s1: String, s2: String) -> Bool in return s1 > s2 } )
122122
<a name="inferring_type_from_context"></a>
123123
### 根据上下文推断类型(Inferring Type From Context)
124124

125-
因为排序闭包函数是作为`sorted`函数的参数进行传入的,Swift可以推断其参数和返回值的类型。
125+
因为排序闭包函数是作为`sort(_:)`方法的参数进行传入的,Swift可以推断其参数和返回值的类型。
126126
`sorted`期望第二个参数是类型为`(String, String) -> Bool`的函数,因此实际上`String`,`String``Bool`类型并不需要作为闭包表达式定义中的一部分。
127127
因为所有的类型都可以被正确推断,返回箭头 (`->`) 和围绕在参数周围的括号也可以被省略:
128128

129129
```swift
130-
reversed = sorted(names, { s1, s2 in return s1 > s2 } )
130+
reversed = names.sort( { s1, s2 in return s1 > s2 } )
131131
```
132132

133133
实际上任何情况下,通过内联闭包表达式构造的闭包作为参数传递给函数时,都可以推断出闭包的参数和返回值类型,这意味着您几乎不需要利用完整格式构造任何内联闭包。
134134

135+
然而您仍然可以明确写出有着完整格式的闭包。如果完整格式的闭包能够提高代码的可读性,则可以采用完整格式的闭包。而在`sort(_:)`方法这个例子里,闭包的目的就是排序,读者能够推测除这个闭包是用于字符串处理的,因为这个闭包是为了处理字符串数组的排序。
136+
135137
<a name="implicit_returns_from_single_expression_closures"></a>
136138
### 单表达式闭包隐式返回(Implicit Return From Single-Expression Clossures)
137139

138140
单行表达式闭包可以通过隐藏`return`关键字来隐式返回单行表达式的结果,如上版本的例子可以改写为:
139141

140142
```swift
141-
reversed = sorted(names, { s1, s2 in s1 > s2 } )
143+
reversed = names.sort( { s1, s2 in s1 > s2 } )
142144
```
143145

144-
在这个例子中,`sorted`函数的第二个参数函数类型明确了闭包必须返回一个`Bool`类型值。
146+
在这个例子中,`sort(_:)`方法的第二个参数函数类型明确了闭包必须返回一个`Bool`类型值。
145147
因为闭包函数体只包含了一个单一表达式 (`s1 > s2`),该表达式返回`Bool`类型值,因此这里没有歧义,`return`关键字可以省略。
146148

147149
<a name="shorthand_argument_names"></a>
@@ -153,7 +155,7 @@ Swift 自动为内联函数提供了参数名称缩写功能,您可以直接
153155
`in`关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成:
154156

155157
```swift
156-
reversed = sorted(names, { $0 > $1 } )
158+
reversed = names.sort( { $0 > $1 } )
157159
```
158160

159161
在这个例子中,`$0``$1`表示闭包中第一个和第二个`String`类型的参数。
@@ -163,11 +165,11 @@ reversed = sorted(names, { $0 > $1 } )
163165

164166
实际上还有一种更简短的方式来撰写上面例子中的闭包表达式。
165167
Swift 的`String`类型定义了关于大于号 (`>`) 的字符串实现,其作为一个函数接受两个`String`类型的参数并返回`Bool`类型的值。
166-
而这正好与`sorted`函数的第二个参数需要的函数类型相符合
168+
而这正好与`sort(_:)`方法的第二个参数需要的函数类型相符合
167169
因此,您可以简单地传递一个大于号,Swift可以自动推断出您想使用大于号的字符串函数实现:
168170

169171
```swift
170-
reversed = sorted(names, >)
172+
reversed = names.sort(>)
171173
```
172174

173175
更多关于运算符表达式的内容请查看 [运算符函数](../chapter2/24_Advanced_Operators.html#operator_functions)
@@ -180,7 +182,7 @@ reversed = sorted(names, >)
180182
尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。
181183

182184
```swift
183-
func someFunctionThatTakesAClosure(closure: () -> ()) {
185+
func someFunctionThatTakesAClosure(closure: () -> Void) {
184186
// 函数体部分
185187
}
186188

@@ -201,7 +203,7 @@ someFunctionThatTakesAClosure() {
201203
在上例中作为`sorted`函数参数的字符串排序闭包可以改写为:
202204

203205
```swift
204-
reversed = sorted(names) { $0 > $1 }
206+
reversed = names.sort() { $0 > $1 }
205207
```
206208

207209
当闭包非常长以至于不能在一行中进行书写时,尾随闭包变得非常有用。
@@ -281,7 +283,7 @@ Swift最简单的闭包形式是嵌套函数,也就是定义在其他函数的
281283
每次调用`incrementor`时,其会以`amount`作为增量增加`runningTotal`的值。
282284

283285
```swift
284-
func makeIncrementor(forIncrement amount: Int) -> () -> Int {
286+
func makeIncrementor(forIncrement amount: Int) -> Void -> Int {
285287
var runningTotal = 0
286288
func incrementor() -> Int {
287289
runningTotal += amount
@@ -291,7 +293,7 @@ func makeIncrementor(forIncrement amount: Int) -> () -> Int {
291293
}
292294
```
293295

294-
`makeIncrementor`返回类型为`() -> Int`
296+
`makeIncrementor`返回类型为`Void -> Int`
295297
这意味着其返回的是一个函数,而不是一个简单类型值。
296298
该函数在每次调用时不接受参数只返回一个`Int`类型的值。
297299
关于函数返回其他函数的内容,请查看[函数类型作为返回类型](../chapter2/06_Functions.html#function_types_as_return_types)

0 commit comments

Comments
 (0)