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 }
还有一种方法:转向Bool?
进入Int
,然后比较Int
s。 您可以指定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
相同。 随你便。
这是另一种方法。
你可以使用flatMap
来删除nil
对象并解开那些存在的对象。 然后,力量解包将是安全的排序:
let flagshipStores = stores.flatMap({ return $0.flagship ? $0 : nil }).sort { $0.flagship! && !$1.flagship! }
这将从arrays中删除具有nil
旗舰的商店。
怎么样:
$0.flagship == true && $1.flagship != true
如果值不是nil并且为true,则左侧将成功;如果值为nil或false,则右侧将成功。
正如Fix.fixit先生在评论中指出的那样,接受的答案并不完全有效,因为它没有照顾到nils。 这是一个额外的字符串样本的正确答案。
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 ) })