Как разделить данные на основе пользовательских параметров даты

Я хотел бы разделить мою модель на основе параметров даты;

Разделы должны быть;

  1. Сегодня
  2. Вчера
  3. На этой неделе
  4. На прошлой неделе
  5. Этот месяц
  6. Прошлый месяц
  7. Этот год
  8. В прошлом году
  9. Старшая

У меня есть модель пользовательского раздела;

struct NotificationSection {
    var date: Date
    var notifications: [NotificationViewModel]
}

private var sections = [NotificationSection]()

В настоящее время я разделяю как;

private func firstDayOfMonth(date: Date) -> Date {
        let calendar = Calendar.current
        let components = calendar.dateComponents([.day, .hour, .month], from: date)
        return calendar.date(from: components)!
    }

private func sectionData() {
        let groups = Dictionary(grouping: self.notifications) { (notification) in
            return firstDayOfMonth(date: Date(timeIntervalSince1970: notification.createdAt))
        }
        self.sections = groups.map { (key, values) in
            return NotificationSection.init(date: key, notifications: values)
        }
        self.sections.sort { (lhs, rhs) in lhs.date > rhs.date }
    }

Но я не уверен, как бы я структурировал такие разделы. Буду ли я запускать расширение на Date?

ОБНОВИТЬ

Я использую эту функцию для разделения данных на основе TimeInterval, а не даты.

func getDay(from interval: TimeInterval) -> TimeInterval {
        let calender = Calendar.current
        let date = Date(timeIntervalSince1970: interval)
        if calender.isDateInToday(date) { return 0 }
        else if calender.isDateInYesterday(date) { return 1 }
        return 2
    }

person David Lintin    schedule 13.05.2020    source источник
comment
Ваши разделы будут иметь повторяющиеся данные. Например, сегодня будет также появляться на этой неделе, в этом месяце и в этом году. Или я неправильно понимаю?   -  person Magnas    schedule 13.05.2020
comment
Нет, извините, если объект сегодня, он будет в разделе сегодня, если вчера вчера и так далее.   -  person David Lintin    schedule 13.05.2020


Ответы (1)


Догадаться. Возможно, это не самый чистый подход, но пока работает.

func sectionData() {
    let groups = Dictionary(grouping: self.notifications) { (notification) in
        return getDay(from: notification.createdAt)
    }
    self.sections = groups.map { (key, values) in
        return NotificationSection.init(date: key, notifications: values)
    }
    self.sections.sort { (lhs, rhs) in lhs.date < rhs.date }
}

func getDay(from interval: TimeInterval) -> TimeInterval {
    let calender = Calendar.current
    let date = Date(timeIntervalSince1970: interval)
    if calender.isDateInToday(date) { return 0 }
    else if calender.isDateInYesterday(date) { return 1 }
    return 2
}

func getSectionTitle(from interval: TimeInterval) -> String {
    if interval == 0 { return "Today" }
    else if interval == 1 { return "Yesterday" }
    return "Older"
}
  1. Данные раздела основаны на временном интервале, а не на дате.
  2. Получить день из временного интервала.
  3. Преобразование временного интервала в строку для заголовка раздела.
person David Lintin    schedule 15.05.2020