2017-04-20 52 views
1

我并不在意这里发生了什么。闭包如何对元素进行排序,并且在碰到数组的末尾时不会抛出超出界限的错误?为什么我不能通过$ 2使用第三个参数?闭包如何访问多个参数?

是否对数组的内建方法进行了排序? (我想我只是回答我自己的问题,但我仍希望能得到一些反馈。)

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

主要生产

[7, 12, 19, 20] 
+3

在Xcode编辑器中单击“sorted”命令,你会看到它是如何定义的(包括例子)。 –

回答

2

是,sorted是内置斯威夫特阵列。如果元素类型实现了Comparable,它可以在没有关闭的情况下完成。所以,你可以省略你的情况下的封闭,并得到相同的结果。

排序算法每次调用元素对的闭包以找出它们的顺序,这就是为什么它需要两个参数。

排序算法通常被设计为使得它们能够以最小的成对比较来推断数组的整个顺序(它不应该将每个元素与其他元素进行比较,也不需要通过循环遍历数组结束)。

这可以帮助你了解(排序算法的可视化):https://visualgo.net/en/sorting?slide=1

1

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

​​

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

该函数自动处理数组的边界并仅向闭包提供有效元素,因此没有超出界限的错误。