2016-03-28 84 views
1

我正在爲NSDate寫一個擴展,它提供了一些failable的初始值設定項。這裏的最終目標是從API獲取日期時間字符串並將其解析爲NSDate,例如,EXC_BAD_ACCESS NSDate格式擴展

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

的日期時間字符串可以採取2種格式之一:

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

這裏是擴展的樣子:

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") 
     } 
    } 
} 

當我嘗試使用這個,它得到一個EXC_BAD_ACCESSif NSDate(dateString: dateString, formatString: "yyyy-MM-dd'T'HH:mm:ssZZZZZ") != nil

任何幫助搞清楚爲什麼這是行不通的讚賞。

編輯:我忘了補充:這個曾與雨燕2.1,並退出與雨燕2.2

回答

5

工作這是斯威夫特2.2的問題。有關更多信息,請參閱SR-704: EXC_BAD_ACCESS on returning nil from a failable initializer of NSObject subclass。看起來它已經在mainline分支中修復了,但並沒有進入最終的Swift 2.2版本。預計它會在下一次更新中得到修復。

作爲臨時解決方法,請務必始終初始化對象,然後從failable初始化程序返回nil(或從拋出初始化程序中引發)。也就是說,在每個return nil聲明前插入self.init()

編輯:此問題已在Swift 2.2.1/Xcode 7.3.1中修復。在返回nil之前,不再需要初始化實例。

+0

這樣做。非常感謝你 :) – Jonathan