2016-11-20 57 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]