2016-08-20 44 views
5

我可以通过它们的“旗舰”布尔属性对这个商店对象数组进行排序,但是我怎么能安全地解开“旗舰”属性呢?swift - 通过可选的布尔属性对对象数组进行排序,而不强制解包

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

我想想你是否真的需要设计中的**二元**类型的“第三个状态”(一个可选的Bool)? – vadian

+0

不幸的是,这不是我的设计。我正在解析一个JSON对象,其中的旗舰可能是真实的,虚假的或未提供的。 –

+0

您可以将*未提供*作为错误吗? – vadian

回答

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

这里有一个错误时,应该这样做。如果只有一个是零,这个代码返回'false',但它应该返回($ 0.flagship == nil && $ 1.flagship!= nil)(如果你想在非零之前排序)。 –

+0

谢谢!它运作良好。 – Raja

1

如何:

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

如果该值不为零,是真正的左侧会成功,右侧会如果值是nil或者虚假的成功。

3

下面是另一种方法。

您可以使用flatMap这将删除nil对象并展开存在的对象。然后,力拆开包装将是安全的排序:

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

这将删除存储从阵列nil旗舰。

4

另一种方法:将Bool?变成Int,然后比较Int s。您可以指定nil值与非nil值的比较方式。

例如,这个排序都falsetruenil值:

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

这个排序都falsetruenil值:

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

您可以使用相同的模式来做niltrue相同或与false相同。随你便。

相关问题