我可以通过'旗舰'布尔属性对这个商店对象数组进行排序,但是如何才能安全地解开'旗舰'属性呢?
let flagshipStores = self.stores.sort {
$0.flagship! && !$1.flagship!
}
答案 0 :(得分:14)
let flagshipStores = self.stores.sort {
guard let flagship0 = $0.flagship, let flagship1 = $1.flagship else { return false }
return flagship0 && !flagship1
}
答案 1 :(得分:7)
另一种方法:将Bool?
转换为Int
,然后比较Int
。您可以指定nil
值与非nil
值的比较方式。
例如,这会在nil
和false
之前对true
值进行排序:
stores.sort { Int($0.flagship ?? -1) < Int($1.flagship ?? -1) }
这会在nil
和false
之后对true
值进行排序:
stores.sort { Int($0.flagship ?? 2) < Int($1.flagship ?? 2) }
您可以使用相同的模式使nil
与true
相同或与false
相同。这取决于你。
答案 2 :(得分:4)
这是另一种方法。
您可以使用method => 'POST'
删除flatMap
个对象并展开存在的对象。然后,力量展开将是安全的排序:
nil
这将删除阵列中具有let flagshipStores = stores.flatMap({ return $0.flagship ? $0 : nil }).sort {
$0.flagship! && !$1.flagship!
}
旗舰的商店。
答案 3 :(得分:1)
怎么样:
$0.flagship == true && $1.flagship != true
如果值不是nil并且为true,则左侧将成功;如果值为nil或false,则右侧将成功。
答案 4 :(得分:0)
正如Fixit先生在评论中指出的那样,已接受的答案无法充分发挥作用,因为它不会解决任何问题。这是带有额外字符串示例的正确答案。
SWIFT 4
进行布尔排序
let flagshipStores = self.stores.sorted(by: {
guard let flagship0 = $0.flagship, let flagship1 = $1.flagship else {
if $0.flagship == nil && $1.flagship == nil || $0.flagship != nil && $1.flagship == nil{
return true
}
else {
return false
}
}
return ($0.flagship == $1.flagship || $0.flagship == true && $1.flagship == false ? true : false)
})
用于字符串比较排序
let stores = self.stores.sorted(by: {
guard let store0 = $0.store, let store1 = $1.store else {
if $0.store == nil && $1.store == nil || $0.store != nil && $1.store == nil{
return true
}
else {
return false
}
}
return ( ($0.store)?.localizedStandardCompare($1.store!) == ComparisonResult.orderedAscending )
})
答案 5 :(得分:0)
要过滤nil
值,只需在compactMap
之前使用sort
let flagshipStores = self.stores.compactMap { return $0.flagship }.sorted {
$0 && !$1
}