簡體   English   中英

Swift:在比較/分割兩個日期數組[Date]之后,如何創建日期數組[[Date]]的數組

[英]Swift: How to create an array of date arrays [ [Date] ], after comparing/splitting two date arrays [Date]

介紹

我正在創建一個日歷應用程序,並且需要管理一個日期數組以便為UITableView提供數據。

語境

數據模型的類型為[Date : [CalendarEvent]] ,其中CalendarEventNSManagedObject子類,我將其分類為與事件相關的日期屬性分組的字典。 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] ]其中每個這些日期的是類型的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM