排序 – 如何按多个条件对Swift对象进行排序
发布时间:2020-12-14 02:24:56 所属栏目:百科 来源:网络整理
导读:我有一个 Swift对象列表,我想按多个标准排序.列表中的对象是DateRange类型: class DateRange { var from: NSDate? var to: NSDate?} 该列表包含许多这些对象,其中某些from或to fields为nil.我希望这个列表排序依据: 首先是所有具有日期的对象 然后至少有一
我有一个
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(<) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |