EXC_BAD_ACCESS 在 NSDate 格式扩展中
EXC_BAD_ACCESS in NSDate formatting extention
我正在为 NSDate 编写一个扩展,它提供了一些可失败的初始化程序。这里的最终目标是从 API 中获取日期时间字符串并将其解析为 NSDate,例如
let createdAt = NSDate(apiDateTimeString: "2016-03-29T18:33:49+06:00")
let createdAt = NSDate(apiDateTimeString: "2016-03-29T18:33:49.730+06:00")
日期时间字符串可以采用以下两种格式之一:
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")
}
}
}
当我尝试使用它时,它在 if NSDate(dateString: dateString, formatString: "yyyy-MM-dd'T'HH:mm:ssZZZZZ") != nil
处得到一个 EXC_BAD_ACCESS
如果您能帮助我们解决为什么这不起作用,我们将不胜感激。
编辑:我忘了补充:这适用于 Swift 2.1,并停止使用 Swift 2.2
这是 Swift 2.2 中的一个问题。有关详细信息,请参阅 SR-704: EXC_BAD_ACCESS on returning nil from a failable initializer of NSObject subclass。看起来它已在主线分支中修复,但没有进入最终的 Swift 2.2 版本。期待在下一次更新中修复。
作为临时解决方法,请确保在从可失败初始化程序返回 nil
(或从可抛出初始化程序抛出)之前始终初始化对象。也就是说,在每个 return nil
语句之前插入 self.init()
。
编辑:此问题已在 Swift 2.2.1/Xcode 7.3.1 中修复。在返回 nil
.
之前不再需要初始化实例
我正在为 NSDate 编写一个扩展,它提供了一些可失败的初始化程序。这里的最终目标是从 API 中获取日期时间字符串并将其解析为 NSDate,例如
let createdAt = NSDate(apiDateTimeString: "2016-03-29T18:33:49+06:00")
let createdAt = NSDate(apiDateTimeString: "2016-03-29T18:33:49.730+06:00")
日期时间字符串可以采用以下两种格式之一:
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")
}
}
}
当我尝试使用它时,它在 if NSDate(dateString: dateString, formatString: "yyyy-MM-dd'T'HH:mm:ssZZZZZ") != nil
EXC_BAD_ACCESS
如果您能帮助我们解决为什么这不起作用,我们将不胜感激。
编辑:我忘了补充:这适用于 Swift 2.1,并停止使用 Swift 2.2
这是 Swift 2.2 中的一个问题。有关详细信息,请参阅 SR-704: EXC_BAD_ACCESS on returning nil from a failable initializer of NSObject subclass。看起来它已在主线分支中修复,但没有进入最终的 Swift 2.2 版本。期待在下一次更新中修复。
作为临时解决方法,请确保在从可失败初始化程序返回 nil
(或从可抛出初始化程序抛出)之前始终初始化对象。也就是说,在每个 return nil
语句之前插入 self.init()
。
编辑:此问题已在 Swift 2.2.1/Xcode 7.3.1 中修复。在返回 nil
.