ios - 为方便初始化而失败的初始化程序失败

标签 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 错误而崩溃。我不明白为什么。

我在这里做错了什么?

最佳答案

如果您使用扩展,您需要在返回 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/

相关文章:

java - 如何在 Java 中初始化数组中的所有整数?

iphone - UITableView 部分背景?

ios - 在 iOS 中使用 afnetworking 图片下载进度条不流畅

ios - Swift 2 无法下标类型错误的值

ios - 当弹出窗口的源 View 在 Swift 中更改时,如何更新弹出窗口的布局(位置)?

ios - CoreBluetooth - 后台模式下的 didDiscoverPeripheral 在没有 LightBlue 的情况下不会被调用

ios - 选择具有两个按钮的 TableView 时更新数组时出错

swift - 是否可以像在 Swift 中使用数组/字典那样遍历结构中的值?

java - 一个类拥有另一个类的实例时,JVM 初始化顺序是什么

C++11 普通旧对象默认值