Search code examples
swift3nscalendar

Swift 3: Internal Extension to Set Time


I had this internal Date extension that appears to no longer work in Swift 3:

internal extension DateComponents {
    func to12pm() {
        self.hour = 12
        self.minute = 0
        self.second = 0
    }
}

The error message is:

Cannot assign to property: 'self' is immutable

How do I achieve this in Swift 3?

Additional Info (if needed): It was called by this Date extension:

func endOfWeek(_ weekday: Int) -> Date? {
    guard
        let cal = Calendar.current,
        var comp: DateComponents = (cal as Calendar).components([.weekOfYear], from: self)
        else {
            return nil
    }
    comp.weekOfYear = 1
    comp.day -= 1
    comp.to12pm()
    return (cal as NSCalendar).date(byAdding: comp, to: self.startOfWeek(weekday)!, options: [])!
} 

Which now looks like this in Swift 3:

func endOfWeek(_ weekday: Int) -> Date? {
    let cal = Calendar.current
    var comp = cal.dateComponents([.weekOfYear], from: self)
    comp.weekOfYear = 1
    comp.day? -= 1
    //This does not have the "comp.to12pm()" that the Swift 2 version did
    return cal.date(byAdding: comp, to: self.startOfWeek(weekday)!)!
}

Solution

  • DateComponents is now a struct thats why it is throwing that error:

    Cannot assign to property: 'self' is immutable

    You need to create a new var from self, change it and return it as follow:

    extension DateComponents {
        var to12pm: DateComponents {
            var components = self
            components.hour = 12
            components.minute = 0
            components.second = 0
            components.nanosecond = 0
            return components
        }
    }