简体   繁体   English

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

[英]Failable initializer for convenience init fails

I have the following NSDate extension initializer to create a NSDate object from a given string. 我有以下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!)
    }
}

But the call to self.init method force unwraps the date variable which is not safe. 但是对self.init方法的调用强制解包不安全的date变量。 So I'm trying to make this a failable initializer. 所以我试图让它成为一个可用的初始化器。

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

But it crashes with a EXC_BAD_ACCESS error at the nil returning line. 但它在nil返回行时因EXC_BAD_ACCESS错误而崩溃。 I can't figure out why. 我无法弄清楚为什么。

What am I doing something wrong here? 我在这做错什么?

If you use extension you need to initialize the "superclass" before returning nil. 如果使用extension ,则需要在返回nil之前初始化“超类”。 See 看到

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

The docs states 文档说明

All of a class's stored properties—including any properties the class inherits from its superclass—must be assigned an initial value during initialization. 所有类的存储属性(包括该类从其超类继承的任何属性)都必须在初始化期间分配初始值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM