您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

斯威夫特:有人可以为我解释这种语法`numbers.sort {$ 0> $ 1}`吗?

斯威夫特:有人可以为我解释这种语法`numbers.sort {$ 0> $ 1}`吗?

@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编程语言”(上面的链接)中进行的操作称为“从上下文推断类型”。当我们在Ints 数组上调用方法时,Swift可以弄清楚我们的val1val2参数也必须是Ints,因此无需我们告诉它。因此,让我们删除类型。这给我们留下了:

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]

希望这有助于澄清问题。

其他 2022/1/1 18:14:28 有499人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶