tobygriffin tobygriffin - 6 months ago 57
Swift Question

Sort array of objects by two properties

This has been asked and answered before using

NSSortDescriptor
where it is quite easy. But is there a Swift-standard way using
Array.sort()
?

struct Sortable {
let isPriority: Bool
let ordering: Int
}


Sorting an array of
Sortables
by one property is simple:

sort { $0.ordering < $1.ordering }


But I want to sort by
isPriority
then by
ordering
- and I can't get my head around a simple statement to make that happen.

Answer

Yes there is a very simple way usint the Array.sort()

Code:

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
})

The sorted array:

true - 10
true - 10
true - 12
true - 12
true - 19
true - 29
false - 16
false - 17
false - 17
false - 17
false - 18

Another a bit shorter solution:

let sorted = array.sorted { t1, t2 in 
   if t1.isPriority == t2.isPriority {
      return t1.ordering < t2.ordering 
   }
   return t1.isPriority && !t2.isPriority 
}