方便init的可用初始化程序失败

时间:2016-06-21 13:20:01

标签: ios swift initialization extension-methods failable

我有以下NSDate扩展名初始值设定项,用于从给定字符串创建NSDate对象。

extension NSDate {
    convenience init(string: String) {
        let dateStringFormatter = NSDateFormatter()
        dateStringFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let date = dateStringFormatter.dateFromString(string)

        self.init(timeInterval:0, sinceDate:date!)
    }
}

但是对self.init方法的调用会强制解包不安全的date变量。所以我试图让它成为一个可用的初始化器。

extension NSDate {
    convenience init?(string: String) {
        let dateStringFormatter = NSDateFormatter()
        dateStringFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

        guard let date = dateStringFormatter.dateFromString(string) else {
            return nil
        }

        self.init(timeInterval:0, sinceDate:date)
    }
}

但它在nil返回行时因 EXC_BAD_ACCESS 错误而崩溃。我无法弄清楚原因。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:-1)

如果使用extension,则需要在返回nil之前初始化“超类”。见

convenience init?(string: String) {
    let dateStringFormatter = NSDateFormatter()
    dateStringFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

    guard let date = dateStringFormatter.dateFromString(string) else {
        self.init()
        return nil
    }

    self.init(timeInterval:0, sinceDate:date)
}

docs

  

所有类的存储属性 - 包括该类从其超类继承的任何属性 - 必须在初始化期间分配初始值。