Swift:在比较/分割两个日期数组[Date]之后,如何创建日期数组[[Date]]的数组

时间:2018-12-04 16:17:56

标签: ios arrays swift sorting date

简介

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

上下文

数据模型的类型为[Date : [CalendarEvent]],其中CalendarEventNSManagedObject的子类,我将其归类为与事件相关的date属性相关的字典。在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
   }

感谢您阅读我的问题。

1 个答案:

答案 0 :(得分:0)

通常,在单个 UITableView 上使用多个数据源会带来倒霉的事情。 ..您可能会考虑更改数据模型。

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

另一种方法-您将切断该词典并使用数组存储类型(建议名称)CalendarItem的对象-在其中可以存储项目的Date[CalendarEvent]? < / p>

尽管如此,有很多方法可以实现,而我将不介绍所有内容...

如果您想坚持自己的模型,这是我做的一个功能。这可能不是最佳解决方案,有一些魔术可以在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
    ]
 ]
 */