我正在使用
self.alldata = self.alldata?.sorted { $0.Edate < $1.Edate }
上面的代码为我提供了按日期排序的数据。但是我如何按月对数据进行排序。这是我在表格 View 中填充的来自服务器的完整日期响应
12-12-2017 09:12:45
如何按月排序?
最佳答案
对于这些特定类型的排序,您可能希望将 EDate
属性拆分为属性组件并使用复合排序描述符 (NSSortDescriptor
)。排序描述符可能很有用,尤其是当您计划优先排序要用于对对象进行排序的键时。它允许您引入主要和次要的排序标准,这有时非常有用。
考虑以下示例:
1。从 NSObject 派生对象并将日期拆分为组件
class MyObject : NSObject {
@objc dynamic var dateYear : Int
@objc dynamic var dateMonth : Int
@objc dynamic var dateDay : Int
// add Hour or Weekday if needed
init(dateYear: Int, dateMonth: Int, dateDay: Int) {
self.dateYear = dateYear
self.dateMonth = dateMonth
self.dateDay = dateDay
}
}
这里使用了@objc dynamic
关键字来获得与基于KVC的Objective-C的NSSortComparator
的兼容性。
照常定义数组:
var objects : [MyObject] = [
MyObject(dateYear: 2017, dateMonth: 12, dateDay: 7),
MyObject(dateYear: 2017, dateMonth: 11, dateDay: 24),
MyObject(dateYear: 2016, dateMonth: 5, dateDay: 9),
MyObject(dateYear: 2016, dateMonth: 2, dateDay: 15),
MyObject(dateYear: 2014, dateMonth: 7, dateDay: 13),
MyObject(dateYear: 2016, dateMonth: 11, dateDay: 1)
]
2。制作排序描述符并排序
var descriptor1 = NSSortDescriptor(key: "dateMonth", ascending: true)
var descriptor2 = NSSortDescriptor(key: "dateYear", ascending: true)
var sorted = (objects as NSArray).sortedArray(using: [descriptor1, descriptor2]) as! [MyObject]
输出(月|年|日)
sorted.forEach {
print($0.dateMonth, $0.dateYear, $0.dateDay)
}
_
2 2016 15
5 2016 9
7 2014 13
11 2016 1
11 2017 24
12 2017 7
指定多个排序描述符可让您确定排序标准的优先级。先考虑月份,按升序排列,有条件的话按年升序排列,日就这样。这是排序描述符有用的地方。
P.S 如果您不需要这些额外的标准并且不关心次要顺序,那么只需比较两个月的组件:
func month(of date: Date) -> Int {
return Calendar.current.component(.month, from: date)
}
var sorted = objects.sorted(by: {month(of: $0.Edate) > month(of: $1.Edate) })
P.P.S 与 NSSortDescriptors
相同的功能可以通过使用那些嵌套的 for
循环编写您自己的排序算法来很好地实现,但是 NSSortDescriptor
非常方便。
关于ios - 按月对数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47746957/