swift - sort an array of objects by their optional boolean property without force unwrapping
let flagshipStores = self.stores.sort {
guard let flagship0 = $0.flagship, let flagship1 = $1.flagship else { return false }
return flagship0 && !flagship1
}
One more approach: turn the Bool?
into an Int
, then compare the Int
s. You get to specify how a nil
value compares to non-nil
values.
For instance, this sorts nil
values before both false
and true
:
stores.sort { Int($0.flagship ?? -1) < Int($1.flagship ?? -1) }
This sorts nil
values after both false
and true
:
stores.sort { Int($0.flagship ?? 2) < Int($1.flagship ?? 2) }
You can use the same pattern to make nil
compare the same as true
or the same as false
. It's up to you.
Here's another approach.
You can use flatMap
which will remove nil
objects and unwrap those that are present. Then, the force unwrap will be safe to sort:
let flagshipStores = stores.flatMap({ return $0.flagship ? $0 : nil }).sort {
$0.flagship! && !$1.flagship!
}
This will remove stores with a nil
flagship from the array.