@the_UB和@moonvader都是正确的,但我只是想将示例从@moonvader扩展一点,只是为了向您展示我们最终如何 $0 > $1
如果查看“快速编程语言”中有关闭包表达式的示例,您会看到对数组进行排序的sort
方法是调用方法,该方法随后可以将函数作为参数。
此函数必须接受两个参数并进行比较,然后返回布尔值。
所以如果我们有这个数组:
let numbers = [4, 6, 8, 1, 3]
和这种方法
func sortBackwards(val1: Int, val2: Int) -> Bool {
print("val1: \(val1) - val2: \(val2)" )
return val1 > val2
}
我们可以像这样对元素进行排序:
numbers.sort(sortBackwards) //gives us [8, 6, 4, 3, 1]
该sort
方法将对sortBackwards
数组中的每个元素使用我们的方法并进行比较。
这是 print
val1: 6 - val2: 4
val1: 8 - val2: 4
val1: 8 - val2: 6
val1: 1 - val2: 4
val1: 3 - val2: 1
val1: 3 - val2: 4
好的,我们减少它。
无需定义函数,我们可以将其作为参数直接添加到sort
方法中,如下所示:
numbers.sort({(val1: Int, val2: Int) -> Bool in
return val1 > val2
})
而且我们仍然以[8,6,4,3,1]结尾(多么幸运!)
好的,接下来我们可以做的是在“ Swift编程语言”(上面的链接)中进行的操作称为“从上下文推断类型”。当我们在Int
s 数组上调用此方法时,Swift可以弄清楚我们的val1
和val2
参数也必须是Int
s,因此无需我们告诉它。因此,让我们删除类型。这给我们留下了:
numbers.sort({val1, val2 in
return val1 > val2
})
仍然是相同的结果。
好,到那儿。我们接下来要做的是在书中称为“单表达闭包的隐式收益”
由于我们的比较可以一行完成,因此我们无需使用return
。所以:
numbers.sort({val1, val2 in val1 > val2})
仍然给我们[8,6,4,4,3,1]
最后,我们要了解@moonvader用更少的词来解释:-)即“速记参数名称”
正如书中所说:
Swift会自动为内联闭包提供速记参数名称,可使用$ 0,$ 1,$ 2等名称来引用闭包参数的值。
因此,在我们的示例中,val1
可以替换为,$0
并且val2
可以替换为$1
这给了我们:
numbers.sort({$0 > $1})
仍然得到[8,6,4,4,3,1]
然后,我们可以继续使用“尾随闭包”,这意味着如果函数的最后一个参数是闭包,则可以在函数的“外部”添加该参数。
因此,我们最终得到:
numbers.sort{$0 > $1}
结果仍然是[8、6、4、3、1]
希望这有助于澄清问题。