2016-03-28 9 views
1

Ich schreibe eine Erweiterung für NSDate, die einige fehlgeleitete Initialisierer bietet. Das Endziel besteht darin, eine Datumszeitreihe von einer API zu erhalten und sie in ein NSDate zu analysieren, z.EXC_BAD_ACCESS in NSDate Formatierung Erweiterung

let createdAt = NSDate(apiDateTimeString: "2016-03-29T18:33:49+06:00") 
let createdAt = NSDate(apiDateTimeString: "2016-03-29T18:33:49.730+06:00") 

Das Datum Zeit Zeichenfolge kann eine von zwei Formate annehmen:

  • yyyy-MM-dd'T'HH:mm:ssZZZZZ
  • yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ

Hier ist, was die Erweiterung wie folgt aussieht:

import Foundation 

public extension NSDate { 

    // MARK: Custom Initializers 

    public convenience init(date: NSDate) { 
     self.init(timeInterval: 0.0, sinceDate: date) 
    } 

    public convenience init?(dateString: String, formatString: String) { 
     let formatter = NSDateFormatter() 
     formatter.dateFormat = formatString 
     formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
     if let date = formatter.dateFromString(dateString) { 
      self.init(date: date) 
     } else { 
      return nil 
     } 
    } 

    public convenience init?(apiDateTimeString: String?) { 
     guard let dateString = apiDateTimeString else { 
      return nil 
     } 
     if NSDate(dateString: dateString, formatString: "yyyy-MM-dd'T'HH:mm:ssZZZZZ") != nil { 
      self.init(dateString: dateString, formatString: "yyyy-MM-dd'T'HH:mm:ssZZZZZ") 
     } else { 
      self.init(dateString: dateString, formatString: "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ") 
     } 
    } 
} 

Wenn ich versuche, dies zu verwenden, erhalte ich eine EXC_BAD_ACCESS unter if NSDate(dateString: dateString, formatString: "yyyy-MM-dd'T'HH:mm:ssZZZZZ") != nil

Jede Hilfe herauszufinden, warum dies nicht funktioniert, wird geschätzt.

EDIT: Ich habe vergessen, hinzuzufügen: das funktionierte mit Swift 2.1, und beendete mit Swift Arbeits 2.2

Antwort

5

Dies ist ein Problem in Swift 2.2. Weitere Informationen finden Sie unter SR-704: EXC_BAD_ACCESS on returning nil from a failable initializer of NSObject subclass. Sieht so aus, als wäre es in der Hauptfiliale repariert worden, hat es aber nicht in die endgültige Version von Swift 2.2 geschafft. Erwarte, dass es beim nächsten Punktupdate behoben wird.

Als vorübergehende Problemumgehung, stellen Sie sicher, dass das Objekt vor der Rückgabe nil von einem fehlgeschlagenen Initialisierer (oder werfen von einem Initialisierer werfen) immer zu initialisieren. Das heißt, fügen Sie self.init() vor jeder return nil Anweisung ein.

Bearbeiten: Dieses Problem wurde in Swift 2.2.1/Xcode 7.3.1 behoben. Es sollte nicht mehr erforderlich sein, die Instanz vor der Rückgabe von nil zu initialisieren.

+0

Das hat es getan. Vielen Dank :) – Jonathan