Как я могу сгруппировать выбранные даты по месяцам - PullRequest
0 голосов
/ 27 августа 2018

Я вставил данные в базовые данные с типом даты, но когда я пытался извлечь данные из базы данных, я не смог сгруппировать их по месяцам. Вы можете найти код, который я пробовал для решения, но он не работал.

let groupedDict = Dictionary(grouping: self.lessons) { (month) -> Date in
        return month.lessonDate!
    }
    var groupedMonth = [[Lessons]]()
    let keys = groupedDict.keys.sorted()
    keys.forEach { (key) in
        groupedMonth.append(groupedDict[key]!)
    }
    groupedMonth.forEach ({
        $0.forEach({print($0)})
        print("--------")
    })

Если бы я дал вам пример того, чего я хочу достичь. Вот пример:

Даты образцов:

  • 04.07.2017

  • 01.08.2018

  • 02.08.2018

  • 05.08.2018

  • 19.09.2018

  • 07.09.2018

Я хотел сгруппировать эти данные как

  • июнь 2017
  • август 2018
  • сентябрь 2018

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Это отправная точка для группировки массива с Dictionary(grouping:by:) по месяцам и годам с использованием DateComponents.

Ключи словаря - это даты. Вы можете отсортировать их и преобразовать в строку с DateFormatter и форматом "MMMM yyyy"

let grouped = Dictionary(grouping: lessons) { lesson -> Date in
    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month], from: lesson.lessonDate!)
    return calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
}

Если из компонентов невозможно создать дату, вместо нее используется 1970-1-1


Примечание: Когда вы все равно распаковываете lessonDate, почему это вообще необязательно?

0 голосов
/ 27 августа 2018

Вы должны использовать Dictionary(grouping:by:) по-другому. Вы должны возвращать значение, по которому хотите группировать, а не для каждого урока отдельную группу.

Помощники

struct Lesson {
    let lessonDate: Date
}

extension Date {
    func addDays(_ days: Int) -> Date {
        return Calendar.current.date(byAdding: .day, value: days, to: self)!
    }

    func addMonths(_ months: Int) -> Date {
        return Calendar.current.date(byAdding: .month, value: months, to: self)!
    }

    var month: Date {
        let calendar = Calendar.current
        return calendar.date(from: calendar.dateComponents([.month, .year], from: self))!
    }

    var prettyMonth: String {
        let formatter = DateFormatter()
        formatter.dateFormat = "MMMM yyyy"
        formatter.locale = Calendar.current.locale!

        return formatter.string(from: self)
    }

    var prettyDate: String {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        formatter.timeStyle = .medium
        formatter.locale = Calendar.current.locale!

        return formatter.string(from: self)
    }
}

Пример

func testing() {
    let lessons: [Lesson] = [
        .init(lessonDate: Date().addDays(2)),
        .init(lessonDate: Date().addDays(3)),
        .init(lessonDate: Date().addMonths(1).addDays(1)),
        .init(lessonDate: Date().addMonths(1).addDays(2)),
        .init(lessonDate: Date().addMonths(1).addDays(3)),
        .init(lessonDate: Date().addMonths(3)),
    ]

    let groupedDict = Dictionary(grouping: lessons, by: { $0.lessonDate.month })

    groupedDict
        .sorted(by: { a, b in a.key < b.key })
        .forEach {
            print("----- \($0.key.prettyMonth) -----")
            $0.value.forEach {
                print("\($0.lessonDate.prettyDate)")
            }
        }
}

Производит

----- August 2018 -----
29. Aug 2018 at 19:38:13
30. Aug 2018 at 19:38:13
----- September 2018 -----
28. Sep 2018 at 19:38:13
29. Sep 2018 at 19:38:13
30. Sep 2018 at 19:38:13
----- November 2018 -----
27. Nov 2018 at 19:38:13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...