我有以下 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 错误而崩溃。我不明白为什么。
我在这里做错了什么?
最佳答案
如果您使用扩展
,您需要在返回 nil 之前初始化“父类(super class)”。见
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州
All of a class’s stored properties—including any properties the class inherits from its superclass—must be assigned an initial value during initialization.
关于ios - 为方便初始化而失败的初始化程序失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37945642/