swift - 通过可选的布尔属性对对象数组进行排序,而不需要强制解包

Chr*_*kes 12 ios swift

我可以通过它们的'旗舰'布尔属性对这个商店对象数组进行排序,但是我怎样才能首先安全地打开'旗舰'属性呢?

let flagshipStores = self.stores.sort {
    $0.flagship! && !$1.flagship!
}
Run Code Online (Sandbox Code Playgroud)

mta*_*eel 17

let flagshipStores = self.stores.sort {
    guard let flagship0 = $0.flagship, let flagship1 = $1.flagship else { return false }
    return flagship0 && !flagship1
}
Run Code Online (Sandbox Code Playgroud)

  • 这里有一个错误.如果只有一个是nil,则此代码返回'false',但它应该返回($ 0.flagship == nil && $ 1.flagship!= nil)(如果你想在非零之前对nil进行排序). (3认同)

Kur*_*vis 9

还有一种方法:将其Bool?转换为a Int,然后比较Ints.您可以指定nil值与非nil值的比较方式.

例如,这个排序nil双方前值falsetrue:

stores.sort { Int($0.flagship ?? -1) < Int($1.flagship ?? -1) }
Run Code Online (Sandbox Code Playgroud)

这个排序nil都经过值falsetrue:

stores.sort { Int($0.flagship ?? 2) < Int($1.flagship ?? 2) }
Run Code Online (Sandbox Code Playgroud)

您可以使用相同的模式进行nil比较,使其相同true或相同false.由你决定.


Aar*_*ger 5

这是另一种方法。

您可以使用flatMapwhich 将删除nil对象并解开存在的对象。然后,强制展开将可以安全地排序:

let flagshipStores = stores.flatMap({ return $0.flagship ? $0 : nil }).sort {
    $0.flagship! && !$1.flagship!
}
Run Code Online (Sandbox Code Playgroud)

这将从nil阵列中删除带有旗舰店的商店。