假设以下内容适用于所有设备是否安全?
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
我不是应用本地化(或任何东西)的专家,所以我不确定是否每个设备都可以使用公历。应用程序使用此日历的方式不是面向用户的,因此我并不关心用户使用的日历,我只想确保上述初始化始终有效。
答案 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工作,也不能保证任何基础课程的可用性。