我一直在使用dateByAddingComponents:toDate:options:
和dateByAddingUnit:value:toDate:options:
,并使用可选绑定从中获取日期。这样的:
guard let startOfNextMonth = calendar.dateByAddingComponents(oneMonthComponent, toDate: startOfThisMonth, options: []) else {
return nil
}
其中oneMonthComponent
只是一个NSDateComponent与月值设置为1。
当我读到它的时候,在文档中他们都这样说:
如果日期超出接收者的定义范围或计算无法执行,则返回nil。
我一直在想,这到底是什么时候造成的。如果我只是给一个日期加上一个月,有没有可能是零?这是因为在其他历法系统中,添加一些单位是没有意义的吗?
我已经搜索了周围,一直无法找到一个实例,它会返回nil。
是否有任何东西可以使上面的代码为nil?有什么例子可以添加零分量?
在实践中,如果您只是在日期中添加一个月,则不会得到nil
值。
nil
值。例如,如果您使用伊斯兰历法并添加-9,999,999年,您将得到nil
(尽管奇怪的是,在其他历法中没有)。在这些极端情况下,其他日历通常会溢出/包裹年份(即使您希望它们返回nil
,根据您引用的文档)。
就我个人而言,我怀疑目前很少有情况下你会得到nil
值。我尝试了各种极端值,伊斯兰历法是我唯一成功获得nil
值的历法。不过,这并不意味着苹果将来不会添加更健壮的日期验证逻辑。我们可能需要从苹果那里得到建议(或者查看NSCalendar
的源代码)才能明确地回答这个问题。
所以,底线,我建议保留您的guard
语句,但它不太可能在实际场景中失败。