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 NSCalendar
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
?
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]
}
}