我有一个 Swift 对象列表,我想按多个条件对其进行排序。列表中的对象属于 DateRange
类型:
class DateRange {
var from: NSDate?
var to: NSDate?
}
该列表包含许多这样的对象,其中一些 from
或 to
字段为 nil。我希望此列表按以下方式排序:
- 首先是所有有日期的对象
- 然后对象至少有一个日期(
from
或to
) - 最后没有对象
日期本身并不重要,重要的是它们的存在。在 Ruby 中我可以这样做(如果日期是 nil
我将它设置为一个非常低的日期):
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(), nil), DateRange(nil, NSDate()), DateRange(nil, nil), DateRange(NSDate(), NSDate())]
ranges.sort { $0.dateCount > $1.dateCount }
如果你愿意,你甚至可以用更多的几行使其Comparable
:
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(<)
关于sorting - 如何按多个条件对 Swift 对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26725224/