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
объект с существующей датой, с добавлением месяца:
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
}
}