NSDate dateByAddingUnit强制选项 - nil不编译

AJ9*_*AJ9 3 ios swift xcode7 swift2 xcode7-beta5

所以我刚试了一下我认为简单的操作 - 给NSDate添加一天:

继这个答案也SO它提供了以下解决方案,而不是我想要什么(但具有相同的逻辑)不工作:

let twoDaysAgo = calendar.dateByAddingUnit(NSCalendarUnit.Day, value: -2, toDate: NSDate(), options: nil)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

"Could not find an overload for 'NSDate.init' that accepts the supplied arguments
Run Code Online (Sandbox Code Playgroud)

删除NSDate()参数后形成这个:

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

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

'Int' is not convertible to 'IntegerListeralConvertible'
Run Code Online (Sandbox Code Playgroud)

在搜索了各种出口之后,事实证明错误在最后的参数中options:nil- 现在必须传递参数.

为什么会这样?

NSHipster声明:

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

虽然Apple没有明确说明论点不能为零

计算选项.有关可能的值,请参阅"日历选项".如果指定"wrap"选项(NSWrapCalendarComponents),则指定的组件会递增并在溢出时回绕到零/ 1,但不会导致更高的单位递增.当wrap选项为false时,单元中的溢出会进入更高的单位,如典型的添加.

这是一个XCode 7 beta错误吗?Swift 2中的新功能?

vad*_*ian 6

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

func dateByAddingUnit(unit: NSCalendarUnit, value: Int, toDate date: NSDate, options: NSCalendarOptions) -> NSDate?
Run Code Online (Sandbox Code Playgroud)

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

在Swift 1.2及更高版本中,您可以使用类型的通用初始值设定项传递空值,但类型必须是不同的

NSCalendarOptions()
Run Code Online (Sandbox Code Playgroud)

在Swift进化过程中有很多变化,所以NSHipster可能会引用Swift的早期版本