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 Ints. 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.

Tags:

Ios

Swift