排序 – 如何按多个条件对Swift对象进行排序

我有一个 Swift对象列表,我想按多个标准排序.列表中的对象是Daterange类型:
class Daterange {
    var from: NSDate?
    var to: NSDate?
}

该列表包含许多这些对象,其中某些from或to fields为nil.我希望这个列表排序依据:

>首先是所有具有日期的对象
>然后至少有一个日期(来自或来自)的对象
>而在最后的对象没有任何

日期本身并不重要,只是它们的存在.在Ruby中,我可以这样做(如果日期为零,我将其设置为非常低的日期):

date_ranges.sort { |a,b|
  [fix_nil(a.from),fix_nil(a.to)] <=> [fix_nil(b.from),fix_nil(b.to)]
}.reverse

def fix_nil(val)
  val.nil? ? Date.new(0) : val
end

使用Swift的最佳方法是什么?提前致谢.

似乎将dateCount计算属性添加到Daterange类型可能是个好主意.这将是模式匹配的好时机:
extension Daterange {
    // returns the number of non-nil NSDate members in 'from' and 'to'
    var dateCount: Int {
        switch (from,to) {
        case (nil,nil): return 0
        case (nil,_): return 1
        case (_,nil): return 1
        default: return 2
        }
    }
}

然后,您可以使用简单的闭包对列表进行排序:

var ranges = [Daterange(nil,nil),Daterange(NSDate(),Daterange(nil,NSDate()),NSDate())]
ranges.sort { $0.dateCount > $1.dateCount }

如果你想,你甚至可以使它与另外几行相比:

extension Daterange : Comparable { }
func ==(lhs: Daterange,rhs: Daterange) -> Bool {
    return lhs.dateCount == rhs.dateCount
}
func <(lhs: Daterange,rhs: Daterange) -> Bool {
    return lhs.dateCount > rhs.dateCount
}

这使您可以使用运算符参数正确地对列表进行排序:

ranges.sort(<)

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...