我可以按照“旗舰”布尔属性对这个存储对象数组进行排序,但是如何安全地首先打开“旗舰”属性呢?
let flagshipStores = self.stores.sort { $0.flagship! && !$1.flagship! }
lp0sw83n1#
let flagshipStores = self.stores.sort { guard let flagship0 = $0.flagship, let flagship1 = $1.flagship else { return false } return flagship0 && !flagship1 }
xcitsw882#
还有一种方法:将Bool?转换为Int,然后比较Int。您可以指定如何比较nil值和非nil值。例如,这会将nil值排序在false和true之前:
Bool?
Int
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进行比较,这由您决定。
vc6uscn93#
这是另一种方法。您可以使用flatMap来移除nil对象,并展开现有的对象。然后,胁迫展开就可以安全地排序:
flatMap
let flagshipStores = stores.flatMap({ return $0.flagship ? $0 : nil }).sort { $0.flagship! && !$1.flagship! }
这将从阵列中删除带有nil旗舰版的商店。
fv2wmkja4#
怎么样:
$0.flagship == true && $1.flagship != true
如果值不为nil且为true,则左侧将成功;如果值为nil或false,则右侧将成功。
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 ) })
xlpyo6sf6#
要过滤nil值,只需在sort之前使用compactMap
sort
compactMap
let flagshipStores = self.stores.compactMap { return $0.flagship }.sorted { $0 && !$1 }
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 } }
7条答案
按热度按时间lp0sw83n1#
xcitsw882#
还有一种方法:将
Bool?
转换为Int
,然后比较Int
。您可以指定如何比较nil
值和非nil
值。例如,这会将
nil
值排序在false
和true
之前:这会将
nil
值排序在false
和true
之后:您可以使用相同的模式使
nil
与true
或false
进行比较,这由您决定。vc6uscn93#
这是另一种方法。
您可以使用
flatMap
来移除nil
对象,并展开现有的对象。然后,胁迫展开就可以安全地排序:这将从阵列中删除带有
nil
旗舰版的商店。fv2wmkja4#
怎么样:
如果值不为nil且为true,则左侧将成功;如果值为nil或false,则右侧将成功。
wvmv3b1j5#
正如Fixit先生在评论中指出的那样,这个公认的答案并不完全有效,因为它没有考虑到nils。
环球银行金融电信协会4
对于布尔排序
用于字符串比较排序
xlpyo6sf6#
要过滤
nil
值,只需在sort
之前使用compactMap
kyks70gy7#
您可以使用此函数来比较可选值,而无需展开。