按两个属性对对象数组进行排序

tob*_*fin 26 sorting swift

在使用之前已经提出并回答了这个问题NSSortDescriptor.但是有没有使用Swift标准的方式Array.sort()

struct Sortable {
    let isPriority: Bool
    let ordering: Int
}
Run Code Online (Sandbox Code Playgroud)

Sortables按一个属性排序数组很简单:

sort { $0.ordering < $1.ordering }
Run Code Online (Sandbox Code Playgroud)

但是我想在isPriority那时候排序ordering- 我无法理解一个简单的陈述来实现这一目标.

Dej*_*dar 43

是的,有一个非常简单的方法使用 Array.sort()

码:

var sorted = array.sorted({ (s1, s2) -> Bool in
    if s1.isPriority && !s2.isPriority {
        return true //this will return true: s1 is priority, s2 is not
    }
    if !s1.isPriority && s2.isPriority {
        return false //this will return false: s2 is priority, s1 is not
    }
    if s1.isPriority == s2.isPriority {
        return s1.ordering < s2.ordering //if both save the same priority, then return depending on the ordering value
    }
    return false
})
Run Code Online (Sandbox Code Playgroud)

排序数组:

true - 10
true - 10
true - 12
true - 12
true - 19
true - 29
false - 16
false - 17
false - 17
false - 17
false - 18
Run Code Online (Sandbox Code Playgroud)

另一个更短的解决方案:

let sorted = array.sorted { t1, t2 in 
   if t1.isPriority == t2.isPriority {
      return t1.ordering < t2.ordering 
   }
   return t1.isPriority && !t2.isPriority 
}
Run Code Online (Sandbox Code Playgroud)

  • 我对你的答案的编辑被拒绝了,所以这里是我使用的代码.`let sorted = array.sorted {t1,t2 in``if t1.isPriority == t2.isPriority {``return t1.ordering <t2.ordering``}``return t1.isPriority &&!t2.isPriority`` }` (4认同)

Joh*_*ohn 13

这是一个简单的声明来做这个排序:

var sorted = array.sort { $0.isPriority == $1.isPriority ? $0.ordering < $1.ordering : $0.isPriority && !$1.isPriority }
Run Code Online (Sandbox Code Playgroud)