2016-11-20 40 views
0

我想了解swift中的闭包,并且缺少一些基本的东西。
考虑下面的例子:Swift Map Sorted Closure

var numbers = [20, 19, 7, 12] 
numbers.map({(number: Int) -> Int in return 3 * number}) 
numbers.map {(number: Int) -> Int in return 3 * number} 
numbers.sorted {(n1:Int, n2:Int) -> Bool in return n1 < n2} 

为什么多余的括号在地图工作,但没有排序? 即

numbers.sorted({(n1:Int, n2:Int) -> Bool in return n1 < n2}) 

不编译...

"error: argument passed to call that takes no arguments" 

请会有人能解释的区别?谢谢。

回答

1

因为排序方法是func sorted(by:)。所以,你必须添加by PARAM名称:

numbers.sorted(by: {(n1:Int, n2:Int) -> Bool in return n1 < n2}) 
+0

这里的概念区别是什么?即为什么map没有**:例如**,或者为什么** by:**被指定为sorted? –

+0

@DuncanRowland,因为正如我在我的回答中提到的那样,它会返回一个带有映射结果的新数组,它不应该映射数组本身。 –

+0

谢谢,但正如你所说,**排序**和**映射**返回新对象(只有**排序** - 我没有考虑 - 改变现有的实例)。 –

1

sorted()

集合的元素的数组排序。

意味着它返回一个新的-sorted-数组,它应该分配给一个新的实例。实现它的简单方法是:

let numbers = [20, 19, 7, 12] 
let sortedNumbers = numbers.sorted { $0 < $1 } // [7, 12, 19, 20] 

如果您需要在阵列本身进行排序,使用sort()代替:

var numbers = [20, 19, 7, 12] 
numbers.sort { $0 < $1 } 

print(numbers) // [7, 12, 19, 20] 

注:使用sort(),确保numbers阵列变种(可变)。

相同的行为也[应用荷到map(_:)

返回包含在序列中的元素给定的闭合 映射的结果的数组。

您也可以implment了一个简单的方法map()

let numbers = [20, 19, 7, 12] 

let mappedNumbers = numbers.map { $0 * 3 } 

print(mappedNumbers) // [60, 57, 21, 36] 

如果你想在阵列本身地图,你应该实现:

var numbers = [20, 19, 7, 12] 
numbers = numbers.map { $0 * 3 } 

print(numbers) // [60, 57, 21, 36] 

或者在一行:

let numbers = [20, 19, 7, 12].map { $0 * 3 } 

print(numbers) // [60, 57, 21, 36]