我一直在使用dateByAddingComponents:toDate:options:
和dateByAddingUnit:value:toDate:options:
并使用可选绑定来获取日期。像这样:
guard let startOfNextMonth = calendar.dateByAddingComponents(oneMonthComponent, toDate: startOfThisMonth, options: []) else {
return nil
}
其中oneMonthComponent
只是一个NSDateComponent,其月值设置为1。
当我读到它时,在文档中他们都说了如下:
如果日期超出接收者的定义范围或者无法执行计算,则返回nil。
我一直在想,究竟是什么时候造成的。如果我只是在某个日期添加一个月,有没有办法可以为零?这是因为在其他日历系统中存在一些差异,在这些系统中添加某些单元并不合理吗?
我已经四处寻找并且无法找到一个返回nil的实例。
有什么可以使上面的代码为零吗?添加组件的例子是什么?
答案 0 :(得分:5)
实际上,如果您只是在某个日期添加一个月,则不会获得nil
个值。
但是,您可以在某些退化情况下获得nil
值。例如,如果您使用伊斯兰日历并添加-9,999,999年,您将获得nil
(但奇怪的是,不会在其他日历中)。在这些极端情况下,其他日历通常会溢出/包装年份(即使您希望它们返回nil
,根据您引用的文档)。
就我个人而言,我怀疑目前很少会出现nil
值的情况。我尝试了各种极端的价值观,伊斯兰历法是我唯一获得nil
价值的日历。但这并不意味着Apple未来可能不会添加更强大的日期验证逻辑。我们可能必须得到Apple的建议(或查看NSCalendar
的源代码)才能明确回答这个问题。
所以,最重要的是,我建议保留你的guard
声明,但在实际情况下它不太可能失败。