NSDate dateByAddingUnit强制选项 - 无法编译

时间:2015-08-18 10:08:16

标签: ios swift swift2 xcode7 xcode7-beta5

所以我只是尝试了我认为简单的操作 - 在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参数未使用;传递nil / 0。

虽然Apple没有明确说明参数不能是nil

  

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

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

NSCalendarOptions()

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

答案 1 :(得分: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))