我试图将自己从objective-c转移到swift,我有一个名为Market的自定义类,这个类包含一些属性,
2017-09-01
它们中的大量存储在一个数组中,我试图按音量属性对该数组进行升序或降序排序。
我试过这个但是没有用,二元运算符'>'不能适用于两个'双?'操作数
class Market {
var name = String?
var volume = Double?
}
最方便的快捷方式是什么?
答案 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