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值与非零值的比较。

例如,这会在falsetrue之前对nil值进行排序:

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

这会在falsetrue之后对nil值进行排序:

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

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