2017-07-14 82 views
0

我有一个方便初始化程序,它调用一个初始化程序,该初始化程序调用带有标头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 
} 
+1

什么是超类的代码? – BallpointBen

+0

@BallpointBen超类是来自目标c文件的类,我已经为它添加了标题 – paul590

+1

是否可以查看生成的obj c文件的swift接口? – BallpointBen

回答

2

您使用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