2

我正在尝试扩展,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在类中的方法上是不可能的。如果我返回值并分配它一切正常,但我想知道这不起作用的确切原因以及是否有更好的解决方法。

4

1 回答 1

7

NSDate 对象封装了一个时间点,独立于任何特定的日历系统或时区。日期对象是不可变的,表示相对于绝对参考日期(2001 年 1 月 1 日 00:00:00 UTC)的不变时间间隔。

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
    }
}
于 2015-12-09T18:13:08.840 回答