【问题标题】:sort an array of custom objects by Double property value with Swift 4使用 Swift 4 按 Double 属性值对自定义对象数组进行排序
【发布时间】:2017-10-31 13:55:58
【问题描述】:

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

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

其中很多存储在一个数组中,我试图按音量属性升序或降序对该数组进行排序。

我试过了但是不行,二元运算符'>'不能应用于两个'Double?'操作数

self.market.sort(by:{$0.volume > $1.volume})

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

【问题讨论】:

  • 为什么属性是可选的?你真的可以拥有一个没有名称或没有数量的市场吗?
  • 我从 json 获取值,api 有可能将 nil 返回到某些属性,但我首先使用可选绑定执行循环并获取所有具有体积的对象和市场名称,然后尝试对我创建的新数组进行排序

标签: arrays swift sorting double


【解决方案1】:

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

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

self.market.sort { ($0.volume ?? 0) > ($1.volume ?? 0) }

更复杂的版本总是会在最后对 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
        }
    }
}

因为无论$1.volume 的值如何,如果$0.volumenil 将返回true,因此可以简化为:

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
    }
}

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

【讨论】:

  • 是的,谢谢,它的工作原理,我在得到 json 响应后首先删除所有 nil 对象值
  • “先清除所有nil值”是什么意思?
  • 对不起,我编辑了我的评论,我的意思是我从数组中删除了这两个属性为 nil 的所有对象,所以我不必为 nil 值而烦恼,json 里面有很多属性.
  • 那为什么要让这两个属性是可选的呢?如果 JSON 数据缺少任一值,请避免创建 Market 实例。然后,当您实际上永远不会有任何没有名称或没有交易量的市场时,您就可以避免处理期权的所有不必要的额外工作。
【解决方案2】:

一种可能的方式。

使用?? 运算符,但确保验证volume

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

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

var volume: Double? = 0.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多