change sort to sorted

This commit is contained in:
numbbbbb
2014-07-19 07:11:48 +08:00
parent f3ff572a16
commit a920bf6d0e

View File

@ -41,25 +41,25 @@ Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进
闭包表达式是一种利用简洁语法构建内联闭包的方式。 闭包表达式是一种利用简洁语法构建内联闭包的方式。
闭包表达式提供了一些语法优化,使得撰写闭包变得简单明了。 闭包表达式提供了一些语法优化,使得撰写闭包变得简单明了。
下面闭包表达式的例子通过使用几次迭代展示了`sort`函数定义和语法优化的方式。 下面闭包表达式的例子通过使用几次迭代展示了`sorted`函数定义和语法优化的方式。
每一次迭代都用更简洁的方式描述了相同的功能。 每一次迭代都用更简洁的方式描述了相同的功能。
<a name="the_sort_function"></a> <a name="the_sorted_function"></a>
### sort 函数The Sort Function ### sorted 函数The Sorted Function
Swift 标准库提供了`sort`函数,会根据您提供的基于输出类型排序的闭包函数将已知类型数组中的值进行排序。 Swift 标准库提供了`sorted`函数,会根据您提供的基于输出类型排序的闭包函数将已知类型数组中的值进行排序。
一旦排序完成,函数会返回一个与原数组大小相同的新数组,该数组中包含已经正确排序的同类型元素。 一旦排序完成,函数会返回一个与原数组大小相同的新数组,该数组中包含已经正确排序的同类型元素。
下面的闭包表达式示例使用`sort`函数对一个`String`类型的数组进行字母逆序排序,以下是初始数组值: 下面的闭包表达式示例使用`sorted`函数对一个`String`类型的数组进行字母逆序排序,以下是初始数组值:
```swift ```swift
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
``` ```
`sort`函数需要传入两个参数: `sorted`函数需要传入两个参数:
* 已知类型的数组 * 已知类型的数组
* 闭包函数,该闭包函数需要传入与数组类型相同的两个值,并返回一个布尔类型值来告诉`sort`函数当排序结束后传入的第一个参数排在第二个参数前面还是后面。如果第一个参数值出现在第二个参数值前面,排序闭包函数需要返回`true`,反之返回`false` * 闭包函数,该闭包函数需要传入与数组类型相同的两个值,并返回一个布尔类型值来告诉`sorted`函数当排序结束后传入的第一个参数排在第二个参数前面还是后面。如果第一个参数值出现在第二个参数值前面,排序闭包函数需要返回`true`,反之返回`false`
该例子对一个`String`类型的数组进行排序,因此排序闭包函数类型需为`(String, String) -> Bool` 该例子对一个`String`类型的数组进行排序,因此排序闭包函数类型需为`(String, String) -> Bool`
@ -69,7 +69,7 @@ let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backwards(s1: String, s2: String) -> Bool { func backwards(s1: String, s2: String) -> Bool {
return s1 > s2 return s1 > s2
} }
var reversed = sort(names, backwards) var reversed = sorted(names, backwards)
// reversed 为 ["Ewa", "Daniella", "Chris", "Barry", "Alex"] // reversed 为 ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
``` ```
@ -99,7 +99,7 @@ var reversed = sort(names, backwards)
下面的例子展示了之前`backwards`函数对应的闭包表达式版本的代码: 下面的例子展示了之前`backwards`函数对应的闭包表达式版本的代码:
```swift ```swift
reversed = sort(names, { (s1: String, s2: String) -> Bool in reversed = sorted(names, { (s1: String, s2: String) -> Bool in
return s1 > s2 return s1 > s2
}) })
``` ```
@ -114,20 +114,20 @@ reversed = sort(names, { (s1: String, s2: String) -> Bool in
因为这个闭包的函数体部分如此短以至于可以将其改写成一行代码: 因为这个闭包的函数体部分如此短以至于可以将其改写成一行代码:
```swift ```swift
reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } ) reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )
``` ```
这说明`sort`函数的整体调用保持不变,一对圆括号仍然包裹住了函数中整个参数集合。而其中一个参数现在变成了内联闭包(相比于`backwards`版本的代码)。 这说明`sorted`函数的整体调用保持不变,一对圆括号仍然包裹住了函数中整个参数集合。而其中一个参数现在变成了内联闭包(相比于`backwards`版本的代码)。
<a name="inferring_type_from_context"></a> <a name="inferring_type_from_context"></a>
### 根据上下文推断类型Inferring Type From Context ### 根据上下文推断类型Inferring Type From Context
因为排序闭包函数是作为`sort`函数的参数进行传入的Swift可以推断其参数和返回值的类型。 因为排序闭包函数是作为`sorted`函数的参数进行传入的Swift可以推断其参数和返回值的类型。
`sort`期望第二个参数是类型为`(String, String) -> Bool`的函数,因此实际上`String`,`String``Bool`类型并不需要作为闭包表达式定义中的一部分。 `sorted`期望第二个参数是类型为`(String, String) -> Bool`的函数,因此实际上`String`,`String``Bool`类型并不需要作为闭包表达式定义中的一部分。
因为所有的类型都可以被正确推断,返回箭头 (`->`) 和围绕在参数周围的括号也可以被省略: 因为所有的类型都可以被正确推断,返回箭头 (`->`) 和围绕在参数周围的括号也可以被省略:
```swift ```swift
reversed = sort(names, { s1, s2 in return s1 > s2 } ) reversed = sorted(names, { s1, s2 in return s1 > s2 } )
``` ```
实际上任何情况下,通过内联闭包表达式构造的闭包作为参数传递给函数时,都可以推断出闭包的参数和返回值类型,这意味着您几乎不需要利用完整格式构造任何内联闭包。 实际上任何情况下,通过内联闭包表达式构造的闭包作为参数传递给函数时,都可以推断出闭包的参数和返回值类型,这意味着您几乎不需要利用完整格式构造任何内联闭包。
@ -138,10 +138,10 @@ reversed = sort(names, { s1, s2 in return s1 > s2 } )
单行表达式闭包可以通过隐藏`return`关键字来隐式返回单行表达式的结果,如上版本的例子可以改写为: 单行表达式闭包可以通过隐藏`return`关键字来隐式返回单行表达式的结果,如上版本的例子可以改写为:
```swift ```swift
reversed = sort(names, { s1, s2 in s1 > s2 } ) reversed = sorted(names, { s1, s2 in s1 > s2 } )
``` ```
在这个例子中,`sort`函数的第二个参数函数类型明确了闭包必须返回一个`Bool`类型值。 在这个例子中,`sorted`函数的第二个参数函数类型明确了闭包必须返回一个`Bool`类型值。
因为闭包函数体只包含了一个单一表达式 (`s1 > s2`),该表达式返回`Bool`类型值,因此这里没有歧义,`return`关键字可以省略。 因为闭包函数体只包含了一个单一表达式 (`s1 > s2`),该表达式返回`Bool`类型值,因此这里没有歧义,`return`关键字可以省略。
<a name="shorthand_argument_names"></a> <a name="shorthand_argument_names"></a>
@ -153,7 +153,7 @@ Swift 自动为内联函数提供了参数名称缩写功能,您可以直接
`in`关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成: `in`关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成:
```swift ```swift
reversed = sort(names, { $0 > $1 } ) reversed = sorted(names, { $0 > $1 } )
``` ```
在这个例子中,`$0``$1`表示闭包中第一个和第二个`String`类型的参数。 在这个例子中,`$0``$1`表示闭包中第一个和第二个`String`类型的参数。
@ -163,11 +163,11 @@ reversed = sort(names, { $0 > $1 } )
实际上还有一种更简短的方式来撰写上面例子中的闭包表达式。 实际上还有一种更简短的方式来撰写上面例子中的闭包表达式。
Swift 的`String`类型定义了关于大于号 (`>`) 的字符串实现,其作为一个函数接受两个`String`类型的参数并返回`Bool`类型的值。 Swift 的`String`类型定义了关于大于号 (`>`) 的字符串实现,其作为一个函数接受两个`String`类型的参数并返回`Bool`类型的值。
而这正好与`sort`函数的第二个参数需要的函数类型相符合。 而这正好与`sorted`函数的第二个参数需要的函数类型相符合。
因此您可以简单地传递一个大于号Swift可以自动推断出您想使用大于号的字符串函数实现 因此您可以简单地传递一个大于号Swift可以自动推断出您想使用大于号的字符串函数实现
```swift ```swift
reversed = sort(names, >) reversed = sorted(names, >)
``` ```
更多关于运算符表达式的内容请查看 [运算符函数](../chapter2/23_Advanced_Operators.html#operator_functions)。 更多关于运算符表达式的内容请查看 [运算符函数](../chapter2/23_Advanced_Operators.html#operator_functions)。
@ -198,10 +198,10 @@ someFunctionThatTakesAClosure() {
> 注意: > 注意:
> 如果函数只需要闭包表达式一个参数,当您使用尾随闭包时,您甚至可以把`()`省略掉。 > 如果函数只需要闭包表达式一个参数,当您使用尾随闭包时,您甚至可以把`()`省略掉。
在上例中作为`sort`函数参数的字符串排序闭包可以改写为: 在上例中作为`sorted`函数参数的字符串排序闭包可以改写为:
```swift ```swift
reversed = sort(names) { $0 > $1 } reversed = sorted(names) { $0 > $1 }
``` ```
当闭包非常长以至于不能在一行中进行书写时,尾随闭包变得非常有用。 当闭包非常长以至于不能在一行中进行书写时,尾随闭包变得非常有用。