使用强制解包初始化NSCalendar

时间:2016-04-24 20:36:43

标签: ios swift localization nscalendar

假设以下内容适用于所有设备是否安全?

let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!

我不是应用本地化(或任何东西)的专家,所以我不确定是否每个设备都可以使用公历。应用程序使用此日历的方式不是面向用户的,因此我并不关心用户使用的日历,我只想确保上述初始化始终有效。

1 个答案:

答案 0 :(得分:1)

编程中没有任何东西是100%安全的,特别是在处理隐藏实现的SDK时。我回答了关于常量NSNotFound here的类似问题。

NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!安全吗?理想情况下,如果Apple选择不更改其SDK,或者它们提供了NSCalendar初始化程序的无错误实现。就防御性编码而言,您有两种选择。

将代码包含在guard中,如Leo Dabus在评论中所建议的那样:

guard let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) else { return }

为了面向未来,Apple可能会改变其可用性或实施方式 NSCalendarIdentifier常量(与NSNotFound一样)。为了增加安全性,请检查常量的存储位置:

if let str: String = NSCalendarIdentifierGregorian {
    if let _: UnsafePointer<Void> = unsafeAddressOf(str) {
        // NSCalendarIdentifierGregorian is defined on your platform
    }
}

在Objective-C中它有点清洁:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wtautological-compare"
BOOL found = (&NSCalendarIdentifierGregorian != NULL);
#pragma clang diagnostic pop
if (found) {
    // safe
}

我不为Apple工作,也不能保证任何基础课程的可用性。