2016-04-24 46 views
1

假设以下内容适用于所有设备是否安全?用强制解包初始化NSCalendar

let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 

我在应用本地化(或任何TBH)的专家,所以我不知道,如果公历将可在每个设备上。应用程序使用此日历的方式不是面向用户的,所以我并不在乎用户正在使用哪个日历,我只是想确保上述初始化将始终有效。

+2

是否有任何问题使用'guard let cal = NSCalendar(calendarIdentifier:NSCalendarIdentifierGregorian)else {return}' –

+0

那么应用程序使用日历来计算一些统计信息(用户不会看到,仅用于应用程序优化和分析),所以如果没有正确的日历,这是一个问题。我不能简单地说,没关系,不要做那么多的处理。 – TimSim

+0

只需使用当前日历 –

回答

1

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

NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!安全吗?理想情况下,如果Apple选择不改变他们的SDK,或者他们提供了一个无bug的NSCalendar初始值设定实现。就防守编码而言,你有两种选择。

裹在guard利奥Dabus代码建议的意见:

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

对于未来的打样,苹果可能会改变 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 
} 

我不为苹果工作,并不能保证任何基金会的可用性类。

+0

谢谢,但问题不是如果返回nil,应用程序会崩溃(我知道如何“守护”代码,使其不会崩溃),但是我将不得不重新设计应用程序的一些重要功能,如果Gregorian日历不能在所有设备上实例化。我可能错误地表述了这个问题。它应该是一个格里高利的NSCalendar是否可以在所有设备上实例化? – TimSim