按月顺序填充 TableView 部分中的对象

Populate objects in TableView sections by months order

我有一个包含日期 属性 的对象数组。我想根据他们的月度顺序在 UITableView 部分中分发它们。我该怎么做?

我的模特:

class Birthday: Object {
    @objc dynamic var name: String = ""
    @objc dynamic var date: Date = Date()
    @objc dynamic var dayLeft: Int = 0
    @objc dynamic var userImageData: Data?
}

首先,我将下一个代码与 DateFormatter 一起使用:

var grouped: [String: [Birthday]] = [:]

grouped = Dictionary(grouping: birthdaysList) { item -> String in
    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month], from: item.date)
    let date = calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
    return date.monthAsString()
}

extension Date {
    func monthAsString() -> String {
            let df = DateFormatter()
            df.setLocalizedDateFormatFromTemplate("MMM")
            return df.string(from: self)
    }
}

然后我使用:

struct Section {
    let month: String
    let birthdays: [Birthday]
}

    var sections: [Section] = []
    let keys = Array(grouped.keys)
    sections = keys.map({Section(month: [=12=], birthdays: grouped[[=12=]]!)})

但我需要按顺序对月份名称进行排序。一月、二月等。如何做到这一点?

我尝试从我的代码中 return 元组,但出现错误

声明的闭包结果“(String, Int)”与上下文类型不兼容'String'

grouped = Dictionary(grouping: birthdaysList) { item -> (String, Int) in
    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month], from: item.date)
    let date = calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
    return (date.monthAsString(), components.month!)
}

创建包装器结构

struct Section {
    let month : String
    let birthdays : [Birthday]
}

然后将分组字典映射到Section

的数组
let keys = Array(grouped.keys)
let sections = keys.map({Section(month: [=11=], birthdays: grouped[[=11=]]!)})

sections 代表章节,birthdays 行,month 章节 header 标题。


编辑:

为了能够按序号对月份进行排序return月份名称前面的数字

grouped = Dictionary(grouping: birthdaysList) { item -> String in
    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month], from: item.date)
    let date = calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
    return  "\(components.month!)_" + date.monthAsString()
}

并修改映射代码

let keys = grouped.keys.sorted{[=13=].localizedStandardCompare() == .orderedAscending}
let sections = keys.map({Section(month: [=13=].components(separatedBy:"_").last!, birthdays: grouped[[=13=]]!)})