swift -按对象的可选布尔属性对对象数组进行排序,而不强制展开

piv4azn7  于 2022-10-31  发布在  Swift
关注(0)|答案(7)|浏览(151)

我可以按照“旗舰”布尔属性对这个存储对象数组进行排序,但是如何安全地首先打开“旗舰”属性呢?

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

lp0sw83n1#

let flagshipStores = self.stores.sort {
    guard let flagship0 = $0.flagship, let flagship1 = $1.flagship else { return false }
    return flagship0 && !flagship1
}
xcitsw88

xcitsw882#

还有一种方法:将Bool?转换为Int,然后比较Int。您可以指定如何比较nil值和非nil值。
例如,这会将nil值排序在falsetrue之前:

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

这会将nil值排序在falsetrue之后:

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

您可以使用相同的模式使niltruefalse进行比较,这由您决定。

vc6uscn9

vc6uscn93#

这是另一种方法。
您可以使用flatMap来移除nil对象,并展开现有的对象。然后,胁迫展开就可以安全地排序:

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

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

fv2wmkja

fv2wmkja4#

怎么样:

$0.flagship == true && $1.flagship != true

如果值不为nil且为true,则左侧将成功;如果值为nil或false,则右侧将成功。

wvmv3b1j

wvmv3b1j5#

正如Fixit先生在评论中指出的那样,这个公认的答案并不完全有效,因为它没有考虑到nils。
环球银行金融电信协会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 )

 })
xlpyo6sf

xlpyo6sf6#

要过滤nil值,只需在sort之前使用compactMap

let flagshipStores = self.stores.compactMap { return $0.flagship }.sorted {
    $0 && !$1
}
kyks70gy

kyks70gy7#

您可以使用此函数来比较可选值,而无需展开。

func sortOptionalValues<T: Comparable>(lhs: T?, rhs: T?) -> Bool? {
    switch (lhs != nil, rhs != nil) {
    case (false, false):
        return nil
    case (true, false):
        return true
    case (false, true):
        return false
    case (true, true):
        guard let lhs = lhs, let rhs = rhs else { return nil }
        return lhs < rhs
    }
}

相关问题