NSDate格式扩展中的EXC_BAD_ACCESS

时间:2016-03-28 19:20:38

标签: ios swift2 nsdate exc-bad-access foundation

我正在为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")
        }
    }
}

当我尝试使用此功能时,它会在EXC_BAD_ACCESS

处获得if NSDate(dateString: dateString, formatString: "yyyy-MM-dd'T'HH:mm:ssZZZZZ") != nil

任何有助于弄清楚为什么不起作用的帮助表示赞赏。

编辑:我忘了添加:这适用于Swift 2.1,并退出使用Swift 2.2

1 个答案:

答案 0 :(得分:5)

这是Swift 2.2中的一个问题。有关更多信息,请参阅SR-704: EXC_BAD_ACCESS on returning nil from a failable initializer of NSObject subclass。看起来它已在主线分支中修复,但没有进入最终的Swift 2.2版本。期望在下一次更新中修复它。

作为临时解决方法,请确保在从可用的初始化程序返回nil之前始终初始化对象(或从抛出初始化程序中抛出)。也就是说,在每个self.init()语句之前插入return nil

编辑:此问题已在Swift 2.2.1 / Xcode 7.3.1中修复。在返回nil之前,不再需要初始化实例。