2017-09-02 82 views
1

我具有例如一個數組:括號中(由:).sorted方法

let myArray = [12,123,412,412,4,124,32] 

,我希望它以升序方式排序,我創建一個函數爲它

func sortedAscending(_ i: Int , _ j: Int) -> Bool{ return i < j } 

然後,我存儲新的分類創建數組變量

let newSorted = myArray.sorted(by : sortedAscending()) 

就在這裏編譯器給了我喜歡的錯誤:錯誤:argume nt傳遞給調用,不需要參數 當我刪除括號它工作正常。任何人都可以解釋爲什麼我應該調用函數sortedAscending沒有括號?

回答

2

原因是因爲當您通過sortedAscending沒有括號時,您傳遞的封閉本身作爲參數。事實上,這是你想要做的,因爲你告訴sorted(by:)使用傳入的閉包進行排序。

相反,如果你加括號sortedAscending(),你告訴編譯器執行關閉,然後再那通過結果sorted(by:)。如果sortedAscending()返回需要兩個Int秒的另一個閉包,這可以工作,但在您的情況下,sortedAscending()只是返回Bool,並且sorted(by:)不能將Bool作爲參數。另外,嘗試撥打sortedAscending()失敗,因爲它需要兩個參數Int,並且您沒有提供任何參數。

當然,錯誤信息完全是誤導性的,聽起來像錯誤與事實完全不同,因爲Swift。

2

sorted(by:)函數期望閉包作爲參數。通過在sortedAscending之後加上括號,您實際上試圖調用sortedAscending函數(不帶參數),並將sortedAscending函數的返回值作爲參數傳遞給sorted(by:)

通過消除括號,您可以正確傳遞函數作爲閉包參數。

但是你不需要一個函數。請做:

let newSorted = myArray.sorted { $0 < $1 }