闭包如何访问多于1个参数?

时间:2017-04-20 19:35:56

标签: swift closures

我不想知道这里发生了什么。闭包如何对元素进行排序,而不是在它到达数组末尾时抛出一个越界错误?为什么我不能通过$ 2使用第三个参数?

是否为数组排序了内置方法? (我想我刚刚回答了我自己的问题,但我仍然希望得到一些反馈。)

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

可生产

[7, 12, 19, 20]

2 个答案:

答案 0 :(得分:2)

是的,sorted内置于Swift Arrays。如果元素类型实现Comparable,它可以在没有闭包的情况下完成。因此,您可以在您的情况下省略闭包并获得相同的结果。

排序算法一次调用元素对的闭包来找出它们的顺序,这就是它需要两个参数的原因。

排序算法通常是这样设计的,它们可以用最小的成对比较来推断数组的整个顺序(它不需要将每个元素与每个元素进行比较,也不是通过简单的循环来实现这一点通过阵列到最后)。

这可能有助于您理解(排序算法可视化):https://visualgo.net/en/sorting?slide=1

答案 1 :(得分:1)

您正在使用此页面上的方法:https://developer.apple.com/reference/swift/array/2296815-sorted

func sorted(by areInIncreasingOrder: (Element, Element) -> Bool) -> [Element]

请注意,它需要一个带有(Element, Element) -> Bool签名的闭包。因此,您为它提供了一个函数,该函数接受两个元素并返回Bool,指示第一个元素是否应该位于第二个元素之前。

该函数自动处理数组的边界,只向闭包提供有效元素,因此没有越界错误。