Swift NSDate Extension Error: Mutating недопустим для методов в классах или связанных с классами протоколов

Я пытаюсь продлить NSDate но я получаю две ошибки:

extension NSDate { //'mutating' isn't valid on methods in classes or class-bound protocols
    mutating func addMonth() {
        let calendar = NSCalendar.currentCalendar()
        let component = NSDateComponents()
        component.month = 1
        self = calendar.dateByAddingComponents(component, toDate: self, options: []) //Cannot assign to value: 'self' is immutable
    }
} 

Я думаю, что NSDate это класс, а не тип Swift и, как говорится, ошибка mutating не возможно на методах в классах. Если я возвращаю значение и назначаю его, все работает, но я хочу знать точную причину, по которой это не работает, и если есть лучший обходной путь.

1 ответ

Решение

NSDate объекты инкапсулируют один момент времени, независимо от какой-либо конкретной календарной системы или часового пояса. Объекты даты являются неизменными и представляют собой неизменный временной интервал относительно абсолютной контрольной даты (00:00:00 UTC 1 января 2001 года).

NSDate Документация

Так как NSDate объекты неизменны, вы не можете произвольно добавить месяц к одному. Вы можете изменить свое расширение, чтобы вернуть новое NSDate объект с существующей датой, с добавлением месяца:

extension NSDate {
    func addMonth() -> NSDate? {
        let calendar = NSCalendar.currentCalendar()
        let component = NSDateComponents()
        component.month = 1
        let newDate = calendar.dateByAddingComponents(component, toDate: self, options: [])
        return newDate
    }
}
Другие вопросы по тегам