使用Swift 4按Double属性值对自定义对象数组进行排序

时间:2017-10-31 13:55:58

标签: arrays swift sorting double

我试图将自己从objective-c转移到swift,我有一个名为Market的自定义类,这个类包含一些属性,

2017-09-01

它们中的大量存储在一个数组中,我试图按音量属性对该数组进行升序或降序排序。

我试过这个但是没有用,二元运算符'>'不能适用于两个'双?'操作数

class Market  {
    var name = String?
    var volume = Double?
}

最方便的快捷方式是什么?

2 个答案:

答案 0 :(得分:2)

由于$NIFI/lib是可选的,因此您无法直接比较这两个值(使用HKEY_LOCAL_MACHINE\_TMPVS_15.0_116e7493\Software\Microsoft\VisualStudio\15.0_116e7493\DialogPage\Microsoft.CustomDocWell.Options\Colors除外)。因此,您需要确定将一个缺失的音量值与另一个缺失音量值或有效音量值进行比较的含义。

如果您想保持简单,可以将缺失的音​​量值视为零。然后您的代码变为:

volume

更复杂的版本总是会在最后对零值进行排序:

==

如果self.market.sort { ($0.volume ?? 0) > ($1.volume ?? 0) } self.market.sort { if let v1 = $0.volume { if let v2 = $1.volume { // Both values exist return v1 > v2 } else { // there is no v2 - treat v1 as < v2 return false } } else { if let v2 = $1.volume { // there is no v1 - treat v2 as < v1 return true } else { // both are nil return true } } } true,无论$0.volume的值是多少,都会返回nil,因此可以将其缩小为:

$1.volume

要考虑的另一个选择是避免使两个属性成为可选项。解析JSON数据时,如果缺少任何一个值,只需跳过该市场,因为有人认为它不是有效的。

答案 1 :(得分:1)

其中一种可能的方式。

使用??运算符,但请务必验证volume

self.market.sorted(by: {$0.volume ?? 0.0 > $1.volume ?? 0.0})

或者使用类属性的默认值。

var volume: Double? = 0.0