Tom Hamming Tom Hamming - 17 days ago 7
iOS Question

Translate NSCalendar.weekdaySymbols index to NSDateComponents.weekday

I'm writing a feature of my iOS app that involves scheduling weekly repeating local notifications on particular days of the week. I'd like to use the

APIs properly so I don't assume things I shouldn't. But I don't see any property on
NSCalendar
about how many days there are in a week.

I'm displaying days of the week using
weekdaySymbols
, and letting the user choose which days they want notifications on. Then I'm scheduling local notifications based on that.

The real question is: How do I translate a day's index in
weekdaySymbols
into the value I give to
NSDateComponents
for
weekday
?

Answer

This is a bit of a simplification, but you can think of days of the week as belonging to the Gregorian calendar, independent of what calendar is actually in use. Those calendars largely govern day/month/year arithmetic, with the days of the week proceeding independently of the particulars of each calendar's number and length of months.

If you accept that as a given, then you just need to correct for the off-by-one difference between a calendar's weekdaySymbols (indexed from 0 to 6) and NSDateComponents.weekday (a value from 1 to 7).

extension DateComponents {     // NSDateComponents in Swift < 3
    func weekdaySymbol(in calendar: Calendar) -> String? {
        guard let weekday = self.weekday else { return nil }
        return calendar.weekdaySymbols[weekday - 1]
    }
}