.sorted(by :)方法中的括号

时间:2017-09-02 20:30:31

标签: arrays swift sorting

我有一个数组,例如:

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())

就在这里编译器给我错误,如:错误:传递给不带参数的调用的参数 当我删除括号时,它工作正常。谁能解释为什么我应该调用一个没有括号的函数sortedAscending?

2 个答案:

答案 0 :(得分:2)

原因是当你传递sortedAscending而没有括号时,你将把闭包本身作为参数传递。事实上,这就是你想要做的,因为你告诉sorted(by:)使用传入的闭包进行排序。

相比之下,如果将括号添加到sortedAscending(),则告诉编译器首先执行闭包,然后传递结果sorted(by:)。如果sortedAscending()返回另一个需要两个Int的闭包,这可行,但在您的情况下,sortedAscending()只返回Bool,而sorted(by:)可以&# 39; t以Bool为参数。此外,调用sortedAscending()的尝试失败,因为它需要两个Int参数,而您没有提供任何参数。

当然,错误信息完全是误导性的,因为错误与实际情况完全不同,因为Swift。

答案 1 :(得分:2)

sorted(by:)函数需要一个闭包作为参数。通过在sortedAscending之后添加括号,您实际上是在尝试调用sortedAscending函数(没有参数)并将sortedAscending函数的返回值作为参数传递给{{1} }。

通过消除括号,您可以正确地将函数作为闭包参数传​​递。

但你不需要一个功能。只是做:

sorted(by:)