我正在开发一个日程安排应用程序。我想要给定月份的所有日期我无法按月份对日期进行分组,这是我尝试过的,但我想要不同的预期结果
\n\nextension Date {\n static func dates(from fromDate: Date, to toDate: Date) -> [Date] {\n var dates: [Date] = []\n var date = fromDate\n\n while date <= toDate {\n dates.append(date)\n guard let newDate = Calendar.current.date(byAdding: .day, value: 1, to: date) else { break }\n date = newDate\n }\n return dates\n }\n var month: Int {\n return Calendar.current.component(.month, from: self)\n }\n}\n\nlet fromDate = Calendar.current.date(byAdding: .day, value: 30, to: Date())\nlet datesBetweenArray = Date.dates(from: Date(), to: fromDate!)\nvar sortedDatesByMonth: [[Date]] = []\nlet filterDatesByMonth = { month in datesBetweenArray.filter { $0.month == month } }\n(1...12).forEach { sortedDatesByMonth.append(filterDatesByMonth($0)) }\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n结果的格式为 [[], [], [], [], [], [], [2019-07-31\n 03:51:19 +0000],\xe2\x80\xa6\xe2 \x80\xa6., [], [], [], []]
\n
我想要期待这样的结果
\n\nstruct ScheduleDates {\n var month: String\n var dates: [Date]\n\n init(month: String, dates: [Date]) {\n self.month = month\n self.dates = dates\n }\n}\nvar sections = [ScheduleDates]()\nRun Code Online (Sandbox Code Playgroud)\n
如果您想按月对日期进行分组,您可以创建Dictionary如下所示的日期:
Dictionary(grouping: datesBetweenArray, by: { $0.month })
这会产生以下格式的输出[Int: [Date]]
字典的关键是你的月份。
现在您可以scheduleDates通过以下方式循环访问此字典来初始化您的结构:
var sections = Dictionary(grouping: datesBetweenArray,
by: ({$0.month}))
.map { tuple in
ScheduleDates(month: String(tuple.0), dates: tuple.1)
}
Run Code Online (Sandbox Code Playgroud)
这是游乐场的代码
我认为你的结构可能应该是Int月份的值,因为当你去填充像表视图这样的东西时,如果你把它们作为Strings.
struct ScheduleDates {
var month: String
var dates: [Date]
}
Run Code Online (Sandbox Code Playgroud)
无论如何,这是我根据您提供的内容编写的扩展。坦率地说,我认为你应该返回一个以 Int 作为键、以 Date 数组作为值的字典,但这就是你想要的......
我曾经Dictionary(grouping:by:)根据日期数组构建字典。
extension Date {
static func dateDictionary(from arrayOfDates: [Date]) -> [String: [Date]] {
// declare a dictionary
return Dictionary(grouping: arrayOfDates) { date -> String in
// get the month as an int
let monthAsInt = Calendar.current.dateComponents([.month], from: date).month
// convert the int to a string...i think you probably want to return an int value and do the month conversion in your tableview or collection view
let monthName = DateFormatter().monthSymbols[(monthAsInt ?? 0) - 1]
// return the month string
return monthName
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我编写的用于生成数据的实用方法,同时我弄清楚了如何做到这一点。如果您要投入生产,请不要像我在这里那样强行打开包装。
// Utility method to generate dates
func createDate(month: Int, day: Int, year: Int) -> Date? {
var components = DateComponents()
components.month = month
components.day = day
components.year = year
return Calendar.current.date(from: components)!
}
Run Code Online (Sandbox Code Playgroud)
下面是我如何生成一组样本日期来进行实验。
// generate array of sample dates
let dateArray: [Date] = {
let months = Array(1...12)
let days = Array(1...31)
let years = [2019]
var dateArray: [Date] = []
while dateArray.count < 100 {
let randomMonth = months.randomElement()
let randomDay = days.randomElement()
let randomYear = years.randomElement()
if let month = randomMonth,
let day = randomDay,
let year = randomYear,
let date = createDate(month: month,
day: day,
year: year) {
dateArray.append(date)
}
}
return dateArray
}()
let monthDictionary = Date.dateDictionary(from: dateArray)
var arrayOfStructs: [ScheduleDates] = []
monthDictionary.keys.forEach { key in
let scheduleDate = ScheduleDates(month: key,
dates: monthDictionary[key] ?? [])
arrayOfStruct.append(scheduleDate)
}
print(arrayOfStructs)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4010 次 |
| 最近记录: |