我可以通过它们的“旗舰”布尔属性对这个商店对象数组进行排序,但是我怎么能安全地解开“旗舰”属性呢?swift - 通过可选的布尔属性对对象数组进行排序,而不强制解包
let flagshipStores = self.stores.sort {
$0.flagship! && !$1.flagship!
}
我可以通过它们的“旗舰”布尔属性对这个商店对象数组进行排序,但是我怎么能安全地解开“旗舰”属性呢?swift - 通过可选的布尔属性对对象数组进行排序,而不强制解包
let flagshipStores = self.stores.sort {
$0.flagship! && !$1.flagship!
}
let flagshipStores = self.stores.sort {
guard let flagship0 = $0.flagship, let flagship1 = $1.flagship else { return false }
return flagship0 && !flagship1
}
这里有一个错误时,应该这样做。如果只有一个是零,这个代码返回'false',但它应该返回($ 0.flagship == nil && $ 1.flagship!= nil)(如果你想在非零之前排序)。 –
谢谢!它运作良好。 – Raja
如何:
$0.flagship == true && $1.flagship != true
如果该值不为零,是真正的左侧会成功,右侧会如果值是nil或者虚假的成功。
下面是另一种方法。
您可以使用flatMap
这将删除nil
对象并展开存在的对象。然后,力拆开包装将是安全的排序:
let flagshipStores = stores.flatMap({ return $0.flagship ? $0 : nil }).sort {
$0.flagship! && !$1.flagship!
}
这将删除存储从阵列nil
旗舰。
另一种方法:将Bool?
变成Int
,然后比较Int
s。您可以指定nil
值与非nil
值的比较方式。
例如,这个排序都false
和true
前nil
值:
stores.sort { Int($0.flagship ?? -1) < Int($1.flagship ?? -1) }
这个排序都false
和true
后nil
值:
stores.sort { Int($0.flagship ?? 2) < Int($1.flagship ?? 2) }
您可以使用相同的模式来做nil
与true
相同或与false
相同。随你便。
我想想你是否真的需要设计中的**二元**类型的“第三个状态”(一个可选的Bool)? – vadian
不幸的是,这不是我的设计。我正在解析一个JSON对象,其中的旗舰可能是真实的,虚假的或未提供的。 –
您可以将*未提供*作为错误吗? – vadian