例如,我有一个数组:
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())在这里,编译器给出了错误,比如: error:传递给调用的参数,当我删除括号时不使用参数,它工作得很好。有人能解释我为什么要调用一个没有括号的函数sortedAscending吗?
发布于 2017-09-02 20:37:41
原因是当您不带括号地传递sortedAscending时,您将闭包本身作为参数传递。事实上,这就是您想要做的,因为您告诉sorted(by:)使用传入的闭包来进行排序。
相反,如果将括号添加到sortedAscending()中,将告诉编译器先执行闭包,然后将结果传递给sorted(by:)。如果sortedAscending()返回另一个包含两个Int的闭包,这可以工作,但在您的示例中,sortedAscending()只返回Bool,而sorted(by:)不能将Bool作为参数。此外,调用sortedAscending()的尝试失败,因为它需要两个Int参数,而您没有提供任何参数。
当然,错误信息是完全误导的,使之听起来像是错误与实际情况完全不同,因为Swift。
发布于 2017-09-02 20:38:22
sorted(by:)函数需要一个闭包作为参数。通过在sortedAscending之后添加括号,您实际上正在尝试调用sortedAscending函数(没有参数),并将sortedAscending函数的返回值作为参数传递给sorted(by:)。
通过消除括号,可以正确地传递函数作为闭包参数。
但你不需要什么功能。只要做:
let newSorted = myArray.sorted { $0 < $1 }https://stackoverflow.com/questions/46017906
复制相似问题