2016-09-06 38 views
6

我一直在使用dateByAddingComponents:toDate:options:dateByAddingUnit:value:toDate:options:,并使用可选的结合来获得日期出来。就像这样:什么时候做dateByAddingComponents:toDate:options return nil?

guard let startOfNextMonth = calendar.dateByAddingComponents(oneMonthComponent, toDate: startOfThisMonth, options: []) else { 
    return nil 
} 

哪里oneMonthComponent只是一个NSDateComponent设置为1

当我读到它月份值,在文档中他们都这样说:

返回如果日期超出接收器定义的范围或计算无法执行,则为零。

而且我一直在想,当恰好造成的。如果我只是在某个日期添加一个月,有没有可能是零的方法?这是否是因为其他日历系统中的某些差异,其中添加了一些单位没有意义?

找遍四周,已经无法找到这样的情况:它会返回零。

有什么事情可以让上面的代码是零?什么是添加组件的例子可能是零?

+0

请注意,在Swift> = 3中,方法名是'date(byAdding:to:options:)'。 –

回答

3

在实践中,如果你只是增加了一个月的日期,你不会得到nil值。

你可以,不过,得到一些退化的情况下一个nil值。例如,如果您使用伊斯兰日历并添加-9,999,999年,您将获得nil(但好奇的是,不在其他日历中)。其他日历通常会在这些极端情况下溢出/包装年份(即使您希望它们返回nil,因为您引用了文档)。

就我个人而言,我怀疑目前很少有情况会得到nil值。我尝试了各种各样的极端价值观,伊斯兰日历是我成功获得价值的唯一一次。但这并不意味着,苹果未来可能不会添加更强大的日期验证逻辑。我们可能必须从苹果公司获得忠告(或者查看NSCalendar的源代码)才能明确回答此问题。

所以,底线,我建议保持您的guard声明,但它不可能在现实世界的情况下失败。

相关问题