【发布时间】:2016-10-23 01:46:22
【问题描述】:
我有以下 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 错误而崩溃。我不知道为什么。
我在这里做错了什么?
【问题讨论】:
-
我知道这很疯狂,但是在警卫内部添加一个毫无意义的
self.init调用(没关系,只要它成功)。即使我返回 nil,我也会因为没有完全初始化 self 而出现编译器错误。 -
@LouFranco 哇,成功了!这是一个 Swift 错误还是我们应该这样做?
-
我无法在 iOS 模拟器中重现该问题,您的代码对我来说很好。
-
@MartinR 我在设备上运行此代码。我正在使用 Xcode 7.3。
-
奇怪,在我的 iOS 9 设备上也可以使用。
标签: ios swift initialization extension-methods failable