события swift в 2-мерный массив, отсортированные по дате

#swift

#swift

Вопрос:

У меня есть массив с событиями, которые отсортированы по дате. Я хочу отдельный раздел для каждого дня [понедельник], [вторник], …. Как мне создать 2-мерный массив, который выглядит следующим образом? И как мне получить каждое событие в соответствующем разделе?

  [
[monday]
[tuesday]
[wednesday] 
. .and so on ]
  
 func getEvents(){
        
        let calendars = eventStore.calendars(for: .event)
        
        for calendar in calendars {
            //            if calendar.title == "Arbeit" {
            
            let anfang = NSDate()
            let ende = Calendar.current.date(byAdding: .day, value: 6, to: anfang as Date)!
            let predicate = eventStore.predicateForEvents(withStart: anfang as Date, end: ende as Date, calendars: [calendar])
            
            let events = eventStore.events(matching: predicate)
            
            var found:Bool = false
            for event in events {
                if (allEvents.count == 0)
                {
                    allEvents.append(event)
                }
                if (allEvents.count > 0)
                {
                    found = false
                    if ( event.title == allEvents[allEvents.count-1].title  amp;amp; event.startDate == allEvents[allEvents.count-1].startDate)
                    {
                        found = true
                    }
                }
                if(!found)
                {
                    allEvents.append(event)
                }
            }
  

Ответ №1:

Следующее решение сначала группирует дату начала на основе событий по дням недели в словаре, а затем преобразует словарь в 2D-массив, сначала отсортированный по сегодняшнему дню

Сначала настройте календарь и DateFormatter для использования

 let locale = Locale(identifier: "en_US_POSIX")
var calendar = Calendar.current
calendar.locale = locale
let formatter = DateFormatter()
formatter.locale = locale
formatter.dateFormat = "EEEE"
  

Группируйте события

 let byWeekday = Dictionary(grouping: events, by: { formatter.string(from: $0.startDate) }) 
  

Получите дни недели в правильном порядке

 let weekdays = calendar.weekdaySymbols
let todayIndex = weekdays.firstIndex(of: formatter.string(from: Date())) ?? calendar.weekdaySymbols.startIndex
let sortedWeekdays = weekdays[todayIndex..<weekdays.endIndex]   weekdays[weekdays.startIndex..<todayIndex]
  

а затем создайте и заполните массив

 var eventsByDay = [[EKEvent]]()

for day in sortedWeekdays {
    eventsByDay.append(byWeekday[day] ?? [])
}
  

Комментарии:

1. Как бы я использовал text = [YourArray componentsJoinedByString:@» n»]; с моим 2-мерным массивом