首页 > 解决方案 > 在 Swift4 中按日期过滤事件

问题描述

我正在构建一个应用程序,为自闭症儿童提供基于预定事件的非常简单的可视日历。到目前为止,我没有遇到任何重大问题,当为每个重复频率(每天、每周、每月、每年)添加第一个事件时,我的事件正在正确过滤。

但是,由于某种原因,当我尝试添加与之前添加的任何事件相匹配的重复频率的第二个事件时,它不会填充。

我试图自己调试和缩小问题范围,但无济于事。我确定我错过了一些非常简单的东西。提前感谢您提供任何帮助跟踪此问题。

此函数按日期过滤整个日期列表:

func filterEvents() {
    filteredEvents = []
    tempEvents = []
    dates = []

    removeOldEvents()
    generateRecurrances()
    extractDates()

    var currentIndex = 0

    for date in dates {
        if filteredEvents.count == 0 {
            filteredEvents.append([])
        }

        else if filteredEvents.count != currentIndex + 1 {
            filteredEvents.append([])
        }

        filteredEvents[currentIndex] = tempEvents.filter({ $0.filterDate() == date })

        currentIndex += 1
    }
}

此函数用于提取必要的信息以按日期过滤:

func extractDates() {
    for event in tempEvents {
        let extractedDate: (month: Int, day: Int, year: Int) = (event.month(), event.day(), event.year())

        dates.append(extractedDate)
    }

    var currentIndex = 0

    for date in dates {
        if currentIndex != 0 {
            if date.month == dates[currentIndex - 1].month && date.day == dates[currentIndex - 1].day && date.year == dates[currentIndex - 1].year {
                dates.remove(at: currentIndex)
                currentIndex -= 1
            }
        }

        currentIndex += 1
    }
}

此函数在创建原始事件时根据用户的偏好生成重复的未来事件:

func generateRecurrances() {
    var dateComponent = DateComponents()
    var daysToAdd = 0
    var weeksToAdd = 0
    var monthsToAdd = 0
    var yearsToAdd = 0

    for event in events {
        if event.recurrenceFrequency == 1 {
            for _ in 1...60 {
                dateComponent.day = daysToAdd
                dateComponent.month = 0
                dateComponent.year = 0

                let newDate = Calendar.current.date(byAdding: dateComponent, to: event.date)

                tempEvents.append(Event(name: event.name, date: newDate!, image: event.image, completion: event.requiresCompletion, recurrenceFrequency: event.recurrenceFrequency))

                daysToAdd += 1
            }
        }

        else if event.recurrenceFrequency == 2 {
            for _ in 1...8 {
                dateComponent.day = weeksToAdd
                dateComponent.month = 0
                dateComponent.year = 0

                let newDate = Calendar.current.date(byAdding: dateComponent, to: event.date)

                tempEvents.append(Event(name: event.name, date: newDate!, image: event.image, completion: event.requiresCompletion, recurrenceFrequency: event.recurrenceFrequency))

                weeksToAdd += 7
            }
        }

        else if event.recurrenceFrequency == 3 {
            for _ in 1...2 {
                dateComponent.day = 0
                dateComponent.month = monthsToAdd
                dateComponent.year = 0

                let newDate = Calendar.current.date(byAdding: dateComponent, to: event.date)

                tempEvents.append(Event(name: event.name, date: newDate!, image: event.image, completion: event.requiresCompletion, recurrenceFrequency: event.recurrenceFrequency))

                monthsToAdd += 1
            }
        }

        else if event.recurrenceFrequency == 4 {
            for _ in 1...2 {
                dateComponent.day = 0
                dateComponent.month = 0
                dateComponent.year = yearsToAdd

                let newDate = Calendar.current.date(byAdding: dateComponent, to: event.date)

                tempEvents.append(Event(name: event.name, date: newDate!, image: event.image, completion: event.requiresCompletion, recurrenceFrequency: event.recurrenceFrequency))

                yearsToAdd += 1
            }
        }

        else if event.recurrenceFrequency == 0 {
            tempEvents.append(event)
        }
    }

    daysToAdd = 0
}

我真的不认为这是相关的,但为了安全起见,这里是用于自动删除日期早于当前日期的事件的函数:

func removeOldEvents() {
    var currentIndex = 0

    let now = Event(name: "Now", date: Date(), image: #imageLiteral(resourceName: "Logo"), completion: false, recurrenceFrequency: 0)

    for event in events {
        if event.year() < now.year() {
            events.remove(at: currentIndex)

            currentIndex -= 1
        }

        else if event.month() < now.month() {
            events.remove(at: currentIndex)

            currentIndex -= 1
        }

        else if event.day() < now.day() {
            events.remove(at: currentIndex)

            currentIndex -= 1
        }

        currentIndex += 1
    }
}

标签: arraysswiftxcode

解决方案


对 extractDates() 的修改解决了这个问题。感谢您为我指明正确的方向。

func extractDates() {
    for event in tempEvents {
        dates.append(event.date)
    }

    var currentIndex = 0

    for date in dates {
        let newDate = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: date)!
        dates[currentIndex] = newDate
        print(dates[currentIndex])
        currentIndex += 1
    }

    var tempDates = dates.removingDuplicates()
    tempDates = tempDates.sorted()
    dates = tempDates

    for date in dates {
        let calendar = Calendar.current

        let year = calendar.component(.year, from: date)
        let month = calendar.component(.month, from: date)
        let day = calendar.component(.day, from: date)

        dateComponents.append((month, day, year))
    }
}

推荐阅读