Swift - 有人可以帮我理解.sorted(by :)在这个例子中是如何工作的吗?

时间:2017-08-08 17:54:00

标签: swift swift3

这段代码通过在数组的开头放置具有特定前缀“searchTerm”的字符串来排序字符串数组,并在末尾放置没有该前缀的字符串。谁能解释一下这个功能是如何工作的如果你还不能说,我是Swift开发的新手,所以请尽可能简单地解释一下。谢谢!

stringArray = stringArray.sorted(by: {
    switch ($0.hasPrefix(searchTerm), $1.hasPrefix(searchTerm) {
        case (true, true): return $0 < $1 ;
        case (true, false): return true ;
        case (false, true): return false ;
        case (false, false): return $0 < $1
    }
})

4 个答案:

答案 0 :(得分:2)

sorted(by:)函数将闭包作为其输入参数,您可以在其中定义自己的排序函数。该函数在元素对中迭代数组。

$0$1是所谓的匿名闭包参数,在这种情况下,$0是当前元素,$1是下一个元件。

switch语句检查当前或下一个元素是否以searchTerm变量中存储的字符串开头。

switch语句的不同状态定义了元素的排序方式。如果两个元素或两个元素都没有前缀,则按字母顺序排序。如果只有其中一个具有前缀,那么拥有它的那个将首先出现在排序数组中。

希望我的解释是充分的,如果没有,请告诉我应该更详细地澄清什么。

答案 1 :(得分:1)

您正在使用的已排序方法会根据您在块中提供的条件对数组进行排序。如果一个项目($ 0)应该在另一个项目($ 1)之前订购,则此块需要返回true

因为如果在字符串的值之前有一个前缀,那么你首先进行排序,比较是这样的:

switch ($0.hasPrefix(searchTerm), $1.hasPrefix(searchTerm) {
    case (true, true): return $0 < $1 ; // If both items have the prefix, just sort them the way strings are normally sorted
    case (true, false): return true ; // Since the first item has a prefix and the second does not, it should appear before the second one, so return true.
    case (false, true): return false ; // Since the second item has a prefix, and the first one does not, the first item should be sorted after the second, so return false
    case (false, false): return $0 < $1 // Since neither items have a prefix, just sort them the way strings are normally sorted.
}

另一种方法可能更清楚:

array.sorted { (first, second) -> Bool in
    switch (first.hasPrefix("p"), second.hasPrefix("p")) {
    case (true, true), (false, false): return first < second
    case (true, false): return true
    case (false, true): return false
    }
}

答案 2 :(得分:1)

stringArray = stringArray.sorted(by: {

在这里,您将stringArray重新分配为自身的排序版本。包含by参数向Swift表明您希望它使用您自己的排序顺序而不是默认排序顺序(在这种情况下,以“searchTerm”开头的内容先于其他任何内容)。

要描述您的排序顺序,您可以使用比较函数 - 一段代码,它从您的数组中获取两个元素并进行比较。我们称这些为elementAelementB。如果elementA出现在elementB之前,则代码应返回true。如果elementB出现在elementA之前,则代码应返回false。通过使用您的代码来确定哪些元素位于其他元素之前,Swift可以根据此规范对您的数组进行排序。

switch ($0.hasPrefix(searchTerm), $1.hasPrefix(searchTerm) {

这一行采用两个元素($0$1)并检查它们是否以“searchTerm”开头。对于每种情况,表达式中的两个布尔值表示$0$1分别以“searchTerm”开头。

case (true, true): return $0 < $1 ;

这两个元素都以“searchTerm”开头,因此您希望返回自然排序(即按字母排序)。您让Swift使用标准比较运算符,因为如果$0 < $1true之前,$0将返回$1,否则将返回false

case (true, false): return true ;

$0以“searchTerm”开头,但$1没有。您希望$0$1之前到达,因此您返回true

case (false, true): return false ;

$0不是以“searchTerm”开头,而是$1。您希望$1$0之前到达,因此您返回false

case (false, false): return $0 < $1

$0$1都不以“searchTerm”开头,因此您再次使用自然排序。

答案 3 :(得分:1)

sorted(by:)可让您指定自己的排序条件。它通过反复询问某些元素如何相互比较来执行排序,方法是运行您给出的闭包并将元素作为参数传递。

这种关闭归结为四种可能的情况:

  • case (true, true): return $0 < $1

    如果$0$1都以searchTerm开头,则它们之间的排序由常规字符串比较决定($0 < $1

  • case (true, false): return true

    如果$0searchTerm开头,但$1没有,则$0 $1

  • case (false, true): return false

    如果$0searchTerm开头,但$ 1不开始,那么$1 $0之后

  • case (false, false): return $0 < $1

    如果$0$1都不以searchTerm开头,则它们之间的排序由常规字符串比较决定($0 < $1