我正在寻找一种更优雅的方式来按领域的不同值对领域对象进行过滤和分组。
我有Task类型的领域对象和Date类型的字段。我想按天对这些对象进行分组。
class Task: Object {
@objc dynamic var name: String
@objc dynamic var date: Date
//... other Realm Object implementation ...
}
我创建了一种特殊的结构来存储和表示日期,并将它们彼此区分开。
struct Day: Hashable {
var month: Int
var year: Int
var day: Int
var hashValue: Int {
return (year * 12 * 30) + (month * 30) + day
}
}
然后将每个任务的日期添加到集合中。
var days: Set<Day> = [] //moth, year, day
allRecords
.forEach {
let components = Calendar.current.dateComponents([.month, .year, .day], from: $0.date)
days.insert(Day(month: components.month!, year: components.year!, day: components.day!))
}
然后每天过滤所有任务。
let history = days.map { day -> (String, Task) in
let dayRecords = allRecords.filter { record in
let components = Calendar.current.dateComponents([.month, .year, .day], from: record.date)
return components.year == day.year && components.month == day.month && components.day == day.day
}
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE, MMM d"
return (
"\(dateFormatter.string(from: dayRecords.first?.date ?? Date()))",
dayRecords)
})
}
此代码可以工作并且可以实现我想要的功能,但是我敢肯定有一种方法可以使它更优雅,更简短。
我的第一个想法:也许我应该将日期存储为Day类。 我的第二个想法:必须有一种通过内部对象的字段值对对象进行排队的方法。
谢谢!
P.S: 可能我的问题与this类似,但领域又迅速。
答案 0 :(得分:1)
如果我正确理解,这就是您要寻找的:
let tasksByDate = Dictionary(grouping: tasks) {
return Calendar.current.dateComponents([.year, .month, .day], from: $0.date)
}
这将创建一个字典,其中包含按日期(键)分组的任务(值)。
文档:https://developer.apple.com/documentation/swift/dictionary/3127163-init