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

Kyr*_*das 1 arrays sorting double swift

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

class Market  {
    var name = String?
    var volume = Double?
}
Run Code Online (Sandbox Code Playgroud)

它们中的很多都存储在一个数组中,我试图通过 volume 属性对这个数组进行升序或降序排序。

我试过了,但不起作用,二元运算符“>”不能应用于两个“双?” 操作数

self.market.sort(by:{$0.volume > $1.volume})
Run Code Online (Sandbox Code Playgroud)

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

rma*_*ddy 5

由于volume是可选的,因此您不能直接比较这两个值(使用 除外==)。因此,您需要决定将一个缺失的音量值与另一个缺失的音量值或有效的音量值进行比较意味着什么。

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

self.market.sort { ($0.volume ?? 0) > ($1.volume ?? 0) }
Run Code Online (Sandbox Code Playgroud)

更复杂的版本总是在最后对 nil 体积值进行排序:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由于true将被返回,如果$0.volumenil不考虑的值$1.volume,可以被简化为:

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 {
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个要考虑的选择是避免将两个属性设为可选。在解析 JSON 数据时,如果缺少任何一个值,只需跳过该市场,因为人们可能会认为它无效。