我不想知道这里发生了什么。闭包如何对元素进行排序,而不是在它到达数组末尾时抛出一个越界错误?为什么我不能通过$ 2使用第三个参数?
是否为数组排序了内置方法? (我想我刚刚回答了我自己的问题,但我仍然希望得到一些反馈。)
var numbers = [20, 19, 7, 12]
let sortedNumbers = numbers.sorted{$1 > $0}
print(sortedNumbers)
可生产
[7, 12, 19, 20]
答案 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
,指示第一个元素是否应该位于第二个元素之前。
该函数自动处理数组的边界,只向闭包提供有效元素,因此没有越界错误。