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

时间:2016-08-20 22:29:56

标签: ios swift

我可以通过'旗舰'布尔属性对这个商店对象数组进行排序,但是如何才能安全地解开'旗舰'属性呢?

let flagshipStores = self.stores.sort {
    $0.flagship! && !$1.flagship!
}

6 个答案:

答案 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值的比较方式。

例如,这会在nilfalse之前对true值进行排序:

stores.sort { Int($0.flagship ?? -1) < Int($1.flagship ?? -1) }

这会在nilfalse之后对true值进行排序:

stores.sort { Int($0.flagship ?? 2) < Int($1.flagship ?? 2) }

您可以使用相同的模式使niltrue相同或与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
}