2017-04-20 47 views
1

我並不在意這裏發生了什麼。閉包如何對元素進行排序,並且在碰到數組的末尾時不會拋出超出界限的錯誤?爲什麼我不能通過$ 2使用第三個參數?閉包如何訪問多個參數?

是否對數組的內建方法進行了排序? (我想我只是回答我自己的問題,但我仍希望能得到一些反饋。)

var numbers = [20, 19, 7, 12] 
let sortedNumbers = numbers.sorted{$1 > $0} 
print(sortedNumbers) 

主要生產

[7, 12, 19, 20] 
+3

在Xcode編輯器中單擊「sorted」命令,你會看到它是如何定義的(包括例子)。 –

回答

2

是,sorted是內置斯威夫特陣列。如果元素類型實現了Comparable,它可以在沒有關閉的情況下完成。所以,你可以省略你的情況下的封閉,並得到相同的結果。

排序算法每次調用元素對的閉包以找出它們的順序,這就是爲什麼它需要兩個參數。

排序算法通常被設計爲使得它們能夠以最小的成對比較來推斷數組的整個順序(它不應該將每個元素與其他元素進行比較,也不需要通過循環遍歷數組結束)。

這可以幫助你瞭解(排序算法的可視化):https://visualgo.net/en/sorting?slide=1

1

你正在使用的方法在此頁:https://developer.apple.com/reference/swift/array/2296815-sorted

​​

注意它需要關閉與(Element, Element) -> Bool簽名。因此,您提供了一個函數,它帶有兩個元素並返回一個Bool,指示第一個元素是否應該在第二個元素之前。

該函數自動處理數組的邊界並僅向閉包提供有效元素,因此沒有超出界限的錯誤。