let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]


func backward(_ s1: String, _ s2: String) -> Bool {
     return s1 > s2
}
var reversedNames = names.sorted(by: backward)
// reversedNames is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

因为参数是传递给向后函数的,所以很难理解发生了什么。这个代码是如何工作的?

最佳答案

发送到数组的sorted方法成对获取该数组的元素,并决定哪个元素排在前面。通过将其应用于数组的所有元素,它最终得到一个排序的数组。
但是“先到”是什么意思?它可以代表任何东西!事实上,你得决定这意味着什么。要告诉sorted方法什么是“先到”的意思,可以将它作为参数传递给一个函数,该函数接受两个元素并返回一个bool,说明第一个元素是否“先到”。
那么,backward就是这样一个函数:

func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}

backward函数表示:只有当第一个参数大于第二个参数时,第一个参数才是第一个参数。
现在我们把backward函数交给sorted方法:
var reversedNames = names.sorted(by: backward)

请注意,backward没有对backward函数的调用;它是backward函数的名称。我们把函数本身交给sorted以便它知道“先到”的含义。
因此,sorted最终返回一个数组,其中每个较大的元素相对于每个较小的元素都“排在第一位”。对于字符串,“较大”的意思是“字母表的后面”,所以我们得到["Ewa", "Daniella", "Chris", "Barry", "Alex"]

10-08 05:48