3

所以我刚刚尝试了我认为是一个简单的操作 - 将一天添加到 NSDate:

在提供以下解决方案的SO上也遵循此答案,虽然不完全是我想要的(但具有相同的逻辑)不起作用:

let twoDaysAgo = calendar.dateByAddingUnit(NSCalendarUnit.Day, value: -2, toDate: NSDate(), options: nil)

我收到以下错误消息:

"Could not find an overload for 'NSDate.init' that accepts the supplied arguments

删除NSDate()参数以形成以下内容后:

let d = NSDate()
let twoDaysAgo = calendar.dateByAddingUnit(NSCalendarUnit.Day, value: -2, toDate: d, options: nil)

我现在得到一个不同的错误:

'Int' is not convertible to 'IntegerListeralConvertible'

在搜索了各种渠道后,发现错误出现在最后一个参数中options:nil——现在必须传递一个参数。

为什么会这样?

NSHipster指出:

components(_:fromDateComponents:toDateComponents:options:):返回两个 NSDateComponents 实例之间的差异。该方法将使用未设置的任何组件的基值,因此至少为每个参数提供年份。options 参数未使用;通过零/ 0。

虽然Apple没有明确说明参数不能为零

计算选项。有关可能的值,请参阅“日历选项”。如果您指定“换行”选项 (NSWrapCalendarComponents),则指定的组件会递增并在溢出时回绕为零/一,但不会导致更高的单位递增。当 wrap 选项为 false 时,单元中的溢出会进入更高的单元,就像典型的加法一样。

这是 XCode 7 测试版错误吗?Swift 2 中的新功能?

4

2 回答 2

6

dateByAddingUnit:toDate:optionsSwift 1.2 及更高版本中的完整签名是

func dateByAddingUnit(unit: NSCalendarUnit, value: Int, toDate date: NSDate, options: NSCalendarOptions) -> NSDate?

options类型显然是非可选类型,因此它不能是nil.

在 Swift 1.2 及更高版本中,您可以使用类型的泛型初始化器传递一个空值,但类型必须是不同的

NSCalendarOptions()

Swift 演变过程中发生了很多变化,所以 NSHipster 可能指的是 Swift 的早期版本

于 2015-08-18T10:21:43.417 回答
2

对于任何有兴趣的人,我都得到了通过以下方式工作/编译的解决方案:

let calendar = NSCalendar.currentCalendar()
let addOneDay = calendar.dateByAddingUnit(NSCalendarUnit.Day, value: 1, toDate: NSDate(), options: NSCalendarOptions.WrapComponents)

或者:

let calendar = NSCalendar.currentCalendar()
let addOneDay = calendar.dateByAddingUnit(NSCalendarUnit.Day, value: 1, toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))
于 2015-08-18T10:08:15.633 回答