gpt4 book ai didi

ios - Swift:比较/拆分两个日期数组[Date]后,如何创建日期数组[[Date]]的数组

转载 作者:行者123 更新时间:2023-11-28 07:34:23 26 4
gpt4 key购买 nike

简介

我正在创建一个日历应用程序,我需要管理一个日期数组以便为 UITableView 提供数据。

上下文

数据模型的类型是[Date : [CalendarEvent]],其中CalendarEvent是一个NSManagedObject子类,我把它分类到字典中根据事件关联的日期属性分组。在我的 UITableView 中,我为该字典的每个键设置了一个部分(我不会一次获取所有日历事件)。但是,我想添加更多部分来显示日期与事件之间的日期间隔差距,使用类型为 [[Date]]

的数组
  • 说明:图片显示我的日历应用程序存储了 2 个事件。一个事件 2018-12-05 和一个事件 2018-12-09,今天的日期是 2018-12-01。在那种情况下,我想检索如下数组:[ [2018-12-01, 2018-12-02, 2018-12-03, 2018-12-04], [2018-12-05 ], [2018-12-06, 2018-12-07, 2018-12-08], [2018-12-09], [2018-12-10] ] 其中每个日期都是类型当然是日期。 (这将产生 4 个部分)

问题

  • 如何对数组进行排序/拆分以满足格式 [[Date]](在上面的“说明”中进行了解释)?
    • 如果有更简单的方法可以达到相同的结果,那也算是一个答案。

我的尝试

我已经缩小到只显示必要的部分。

class CalendarViewController: UIViewController {
private let currentCalenar = Calendar.current
var events : [Date: [CalendarEvent]]? // Events is fetched from todays date and 10 days forward.
var sectionDates : [[Date]]?

func getDatesWithEvents() -> [Date]? {
if let keyArray = events?.keys {
var dateArray = Array(keyArray)
dateArray.sort { $0 < $1 }
return dateArray
}
return nil
}

func getSectionDatesArray() -> [[Date]]? {
var sectionDatesArray : [[Date]] = []
var currentDate = currentCalendar.startOfDay(for: Date())
guard let endDate = currentCalendar.date(byAdding: .day, value: 9, to: currentDate), let datesWithEvent = getDatesWithEvents() else { return nil }
while currentDate < endDate {
if datesWithEvent.contains(currentDate) {
sectionDatesArray.append([currentDate])
sectionDatesArray.append([])
} else {
if !sectionDatesArray.isEmpty {
sectionDatesArray[sectionDatesArray.count - 1].append(currentDate)
} else {
sectionDatesArray.append([currentDate])
}
}
currentDate = currentCalendar.date(byAdding: .day, value: 1, to: currentDate)!
}
sectionDatesArray.removeAll { (sequence) -> Bool in
sequence.isEmpty
}
return sectionDatesArray
}

感谢阅读我的问题。

最佳答案

一般来说,在单个 UITableView 上使用多个数据源 会带来坏运气。..您可能会考虑更改数据模型。

在您的示例中,我会考虑合并这两个数据源,使没有事件的日期值将为 nil,因此您可以将其声明为 var dates: [Date: [日历事件]?]?

另一种方法 - 你会切断这个字典并使用数组来存储类型(建议名称)CalendarItem 的对象 - 你可以在那里存储项目的日期[日历事件]?

不过,有很多方法可以做到这一点,我不会一一介绍...

如果您想坚持使用您的模型,这是我制作的一个函数。它可能不是最佳解决方案,并且有一些魔法可以在 4 行中完成 :) 但在这里 -

var currentDate = Date()

// just made up dates
let datesWithEvents: [Date] = [
Calendar.current.date(byAdding: .day, value: 5, to: currentDate)!,
Calendar.current.date(byAdding: .day, value: 10, to: currentDate)!
]

let endDate = Calendar.current.date(byAdding: .day, value: 15, to: currentDate)!

var dates: [[Date]] = []
while currentDate < endDate{

if datesWithEvents.contains(currentDate){
dates.append([currentDate])
dates.append([])
}else{

if !dates.isEmpty{
dates[dates.count - 1].append(currentDate)
}else{
dates.append([currentDate])
}
}

currentDate = Calendar.current.date(byAdding: .day, value: 1, to: currentDate)!
}

/* prints
[
[
2018-12-04 17:57:44 +0000
2018-12-05 17:57:44 +0000
2018-12-06 17:57:44 +0000
2018-12-07 17:57:44 +0000
2018-12-08 17:57:44 +0000
],
[2018-12-09 17:57:44 +0000],
[
2018-12-10 17:57:44 +0000,
2018-12-11 17:57:44 +0000,
2018-12-12 17:57:44 +0000,
2018-12-13 17:57:44 +0000
],
[2018-12-14 17:57:44 +0000],
[
2018-12-15 17:57:44 +0000,
2018-12-16 17:57:44 +0000,
2018-12-17 17:57:44 +0000,
2018-12-18 17:57:44 +0000
]
]
*/

关于ios - Swift:比较/拆分两个日期数组[Date]后,如何创建日期数组[[Date]]的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53617216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com