Swift sort array of objects based on boolean value

23,755

Solution 1

Swift's arrays can be sorted in place with sort or to a new array with sorted. The single parameter of either function is a closure taking two elements and returning true if the first is ordered before the second. The shortest way to use the closure's parameters is by referring to them as $0 and $1.

For example (to sort the true booleans first):

// In-place:
array.sort { $0.selected && !$1.selected }

// To a new array:
array.sorted { $0.selected && !$1.selected }

(edit: Updated for Swift 3, 4 and 5, previously sort was sortInPlace and sorted was sort.)

Solution 2

New (for Swift 1.2)

return results.sort { $0.selected && !$1.selected }

Old (for Swift 1.0)

Assuming results is of type [VDLProfile] and VDLProfile has a Bool member selected:

return results.sorted { $0.selected < $1.selected }

See documentation for sorted

Share:
23,755
Antoine
Author by

Antoine

iOS Developer at WeTransfer - Follow me on twitter.com/twannl for more tips &amp; tricks - Weekly Swift blog posts at avanderlee.com

Updated on July 05, 2022

Comments

  • Antoine
    Antoine almost 2 years

    I'm looking for a way to sort a Swift array based on a Boolean value.

    I've got it working using a cast to NSArray:

    var boolSort = NSSortDescriptor(key: "selected", ascending: false)
    var array = NSArray(array: results)
    return array.sortedArrayUsingDescriptors([boolSort]) as! [VDLProfile]
    

    But I'm looking for the Swift variant, any ideas?

    Update Thanks to Arkku, I've managed to fix this using the following code:

    return results.sorted({ (leftProfile, rightProfile) -> Bool in
        return leftProfile.selected == true && rightProfile.selected != true
    })
    
  • Antoine
    Antoine over 9 years
    Thanks, using your answer I've managed to fix this in Swift. I've updated my question with the answer.
  • Antoine
    Antoine over 9 years
    This gave me an error: Cannot invoke 'sorted' with an argument list of type.
  • Andrew Ho
    Andrew Ho over 7 years
    Please note that in Swift 3.0 .sort is used
  • atultw
    atultw over 2 years
    This doesn't answer the question - OP needs to sort by boolean values which cannot be compared using > or <. (also the first sentence is copied word for word from the Swift book)