我有一个方便的初始化器,它调用带有头init!(data: Data!)的超类初始化器。我不明白的是,为什么我会收到以下错误:
致命错误:在展开可选值时意外找到零。
我尝试过初始化一个没有数据的随机Data对象,但是我仍然得到了这个错误,有什么想法吗?
代码:
Convenience init(itemId: String) {
    let d: Data = Data.init()
    self.init(data: d) // error here!
}
required init!(data: Data?) {
    super.init(data: data)
}来自obj c库的超类:
-(id)initWithData:(NSData*)data {
    if ([self init]) {
       //some code
    }
    return nil
}发布于 2017-07-14 21:26:02
您使用的是隐式解包可选参数和初始化器。如果您希望有一个可失败的初始化器,则应该使用init?。至于传递一个隐式解包的参数。这也很危险。将内容标记为隐式展开非常方便,可以避免Swift编译器的抱怨,但这通常会导致这个问题。
问题是您对super.init的调用是返回nil。
此示例向您展示了执行可失败初始化的安全方法。
// This is a stand in for what your super class is doing
// Though I can't tell you why it is returning nil
class ClassB {
    required init?(data: Data?) {
        return nil
    }
}
class ClassA: ClassB {
    convenience init?(itemId: String) {
        let d: Data = Data.init()
        self.init(data: d) // error here!
    }
    required init?(data: Data?) {
        super.init(data: data)
    }
}
if let myObject = ClassA.init(itemId: "ABC") {
    // non-nil
} else {
    // failable initializer failed
}https://stackoverflow.com/questions/45111630
复制相似问题