2016-04-24 7 views
1

Ist es sicher anzunehmen, dass das Folgende auf allen Geräten funktioniert?Initialisieren von NSCalendar mit erzwungenem Auspacken

let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 

Ich bin kein Experte auf App-Lokalisierung (oder irgendetwas TBH), also bin ich nicht sicher, ob der Gregorianische Kalender auf jedem Gerät verfügbar sein wird. Die Art und Weise, wie die App diesen Kalender verwendet, ist nicht benutzerorientiert. Daher ist es mir egal, welchen Kalender der Benutzer verwendet. Ich möchte nur sichergehen, dass die obige Initialisierung immer funktioniert.

+2

ist es irgendein Problem mit 'Wachen lassen cal = NSCalendar (calendarIdentifier: NSCalendarIdentifierGregorian) else {return}' –

+0

Nun nutzt die App den Kalender einige Statistiken zu berechnen (dh der Benutzer und Analysen nicht nur für App-Optimierung sehen), wenn der richtige Kalender nicht verfügbar ist, ist das ein Problem. Ich kann nicht einfach sagen, macht nichts, mach das ganze Processing dann nicht. – TimSim

+0

Benutze einfach den aktuellen Kalender –

Antwort

1

Nichts ist jemals 100% sicher in der Programmierung, besonders wenn es sich um ein SDK handelt, bei dem die Implementierung ausgeblendet ist. Ich beantwortete eine ähnliche Frage über die Konstante NSNotFoundhere.

Ist NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! sicher? Im Idealfall, wenn Apple das SDK nicht ändert oder wenn es eine fehlerfreie Implementierung des Initialisierers NSCalendar bietet. Soweit defensive Codierung geht, haben Sie zwei Möglichkeiten.

Wickeln Sie den Code in einem guard als Leo Dabus in den Kommentaren vorgeschlagen:

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

Für Zukunftssicherheit kann Apple die Verfügbarkeit oder die Umsetzung des NSCalendarIdentifier Konstanten ändern (wie bei NSNotFound gesehen). Für zusätzliche Sicherheit, überprüfen Sie den Speicherort der Konstanten:

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

Es ist ein wenig sauberer in Objective-C:

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

ich nicht für Apple arbeiten und die Verfügbarkeit von Stiftung nicht garantieren können, Klassen.

+0

Danke, aber das Problem ist nicht, dass die App abstürzen wird, wenn Nil zurückgegeben wird (ich weiß, wie man den Code schützt, damit es nicht abstürzt), aber dass ich einige wichtige Funktionen der App neu gestalten muss, wenn der Gregorianer Der Kalender kann nicht auf allen Geräten instanziiert werden. Ich könnte die Frage falsch formuliert haben. Es hätte Can ein Gregorianischer NSCalendar auf allen Geräten instanziiert werden können oder nicht? – TimSim