Swift中的速记

时间:2014-06-08 16:31:38

标签: swift

所以我目前正在Apple网站上浏览“A Swift Tour”教程。 (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-XID_1

我的混淆来自Sort / Shorthand部分。给出的例子是

sort([1, 5, 3, 12, 2]) { $0 > $1 }

我打印封口,看看发生了什么,这就是我得到的:

The $0 is 5 and the $1 is 1
The $0 is 3 and the $1 is 5
The $0 is 3 and the $1 is 1
The $0 is 12 and the $1 is 5
The $0 is 2 and the $1 is 12
The $0 is 2 and the $1 is 5
The $0 is 2 and the $1 is 3
The $0 is 2 and the $1 is 1

在第一行,注意$ 1是1而$ 0是5.我的问题是为什么数字“1”不是指定为$ 0(而不是$ 1),因为它在数组中排在第一位。我理解算法和所有......这只是困扰我的速记归属。我想这很挑剔,但如果有人能为我清楚这一点,我会非常感激!

1 个答案:

答案 0 :(得分:6)

这与速记无关,它只是在排序的内部实现中进行优化。将参数传递给闭包的顺序并不重要,因此在内部它们将以任何有效的顺序传递。

查看比较的顺序,看起来正在发生的是插入排序 - 小数据集的常用算法,通常在特定列表长度之上选择快速排序。

正如您在最后处理2时所看到的那样,插入排序会获取每个新元素,并遍历已排序的数据以找到其正确的位置。因此,首先选择$ 0,然后依次为每个现有元素设置$ 1。

在算法的最开始,没有进行比较,因此1永远不会放入$ 0插槽。需要的第一个比较有新元素5,现有元素1。