首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有数据错误的超级init

有数据错误的超级init
EN

Stack Overflow用户
提问于 2017-07-14 21:09:12
回答 1查看 250关注 0票数 0

我有一个方便的初始化器,它调用带有头init!(data: Data!)的超类初始化器。我不明白的是,为什么我会收到以下错误:

致命错误:在展开可选值时意外找到零。

我尝试过初始化一个没有数据的随机Data对象,但是我仍然得到了这个错误,有什么想法吗?

代码:

代码语言:javascript
复制
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库的超类:

代码语言:javascript
复制
-(id)initWithData:(NSData*)data {
    if ([self init]) {
       //some code
    }
    return nil
}
EN

Stack Overflow用户

回答已采纳

发布于 2017-07-14 21:26:02

您使用的是隐式解包可选参数和初始化器。如果您希望有一个可失败的初始化器,则应该使用init?。至于传递一个隐式解包的参数。这也很危险。将内容标记为隐式展开非常方便,可以避免Swift编译器的抱怨,但这通常会导致这个问题。

问题是您对super.init的调用是返回nil

此示例向您展示了执行可失败初始化的安全方法。

代码语言:javascript
复制
// 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
}
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45111630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档