[英]Swift: How to create an array of date arrays [ [Date] ], after comparing/splitting two date arrays [Date]
我正在創建一個日歷應用程序,並且需要管理一個日期數組以便為UITableView
提供數據。
數據模型的類型為[Date : [CalendarEvent]]
,其中CalendarEvent
是NSManagedObject
子類,我將其分類為與事件相關的日期屬性分組的字典。 在UITableView
,該字典的每個鍵都有一個部分(我不會一次獲取所有日歷事件)。 但是,我想添加更多部分以使用類型[[Date]]
的數組顯示帶有事件的日期之間的日期間隔差距
[ [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] ]
其中每個這些日期的是類型的Date
當然。 (這將分四個部分進行) [[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: [CalendarEvent]?]?
。
另一種方法-您將切斷該詞典並使用數組存儲類型(建議名稱) CalendarItem
-在其中可以存儲項目的Date
和[CalendarEvent]?
盡管如此,有很多方法可以做到這一點,而我不會覆蓋所有這些內容。
如果您想堅持自己的模型,這是我做的一個功能。 這可能不是最佳解決方案,有一些魔術可以在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
]
]
*/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.