我有一个数组,例如:
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?
答案 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:)