Swift sort array of objects based on boolean value
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
Antoine
iOS Developer at WeTransfer - Follow me on twitter.com/twannl for more tips & tricks - Weekly Swift blog posts at avanderlee.com
Updated on July 05, 2022Comments
-
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 over 9 yearsThanks, using your answer I've managed to fix this in Swift. I've updated my question with the answer.
-
Antoine over 9 yearsThis gave me an error: Cannot invoke 'sorted' with an argument list of type.
-
Andrew Ho over 7 yearsPlease note that in Swift 3.0 .sort is used
-
atultw over 2 yearsThis 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)