How to compare dates in Swift

Let's say you want to track x event the user do at x time/date, for instance track when certain api was updated. For that you create a variable:

// Stores the last time the API was updated, it will be updated once a week
    @AppStorage("coingekoWhiteListApiLastUpdated") var coingekoWhiteListApiLastUpdated: Date = Date()

Now on your function you can check like this:

let isSameWeek = coingekoWhiteListApiLastUpdated.isInThisWeek

// If the weeks are different then update API
if(!isSameWeek) {
    await updateCoingekoApi()
}

The function to check this would look like this:

// Checks if Dates are the same or different
extension Date {
    func isEqual(to date: Date, toGranularity component: Calendar.Component, in calendar: Calendar = .current) -> Bool {
        calendar.isDate(self, equalTo: date, toGranularity: component)
    }

    func isInSameYear(as date: Date) -> Bool { isEqual(to: date, toGranularity: .year) }
    func isInSameMonth(as date: Date) -> Bool { isEqual(to: date, toGranularity: .month) }
    func isInSameWeek(as date: Date) -> Bool { isEqual(to: date, toGranularity: .weekOfYear) }

    func isInSameDay(as date: Date) -> Bool { Calendar.current.isDate(self, inSameDayAs: date) }

    var isInThisYear:  Bool { isInSameYear(as: Date()) }
    var isInThisMonth: Bool { isInSameMonth(as: Date()) }
    var isInThisWeek:  Bool { isInSameWeek(as: Date()) }

    var isInYesterday: Bool { Calendar.current.isDateInYesterday(self) }
    var isInToday:     Bool { Calendar.current.isDateInToday(self) }
    var isInTomorrow:  Bool { Calendar.current.isDateInTomorrow(self) }

    var isInTheFuture: Bool { self > Date() }
    var isInThePast:   Bool { self < Date() }
}

You can also do some common operations such as:

let now = Date()
let soon = Date().addingTimeInterval(5000)	// addingTimeInterval is in seconds

now == soon
now != soon
now < soon
now > soon