数据错误的超级初始化
问题描述:
我有一个方便初始化程序,它调用一个初始化程序,该初始化程序调用带有标头init!(data: Data!)
的超类初始化程序。我不明白的是为什么我收到以下错误:数据错误的超级初始化
fatal error: unexpectedly found nil while unwrapping an Optional value.
我曾尝试初始化随机Data
对象没有数据,但我仍然得到这个错误任何想法?
代码:从obj获得的C库
Convenience init(itemId: String) {
let d: Data = Data.init()
self.init(data: d) // error here!
}
required init!(data: Data?) {
super.init(data: data)
}
超类:
-(id)initWithData:(NSData*)data {
if ([self init]) {
//some code
}
return nil
}
答
您使用implicitly unwrapped optional参数和初始化。如果你想有一个可分解的初始化程序,你应该使用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
}
+0
谢谢你的帮助,这很棘手,但你明白了!再次谢谢你,我的问题已经解决了! – paul590
什么是超类的代码? – BallpointBen
@BallpointBen超类是来自目标c文件的类,我已经为它添加了标题 – paul590
是否可以查看生成的obj c文件的swift接口? – BallpointBen