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"]
。