一尘不染

类未实现其超类的必需成员

swift

因此,我今天更新到Xcode 6 beta 5,并注意到我在Apple类的几乎所有子类中都收到了错误。

错误状态:

类“ x”未实现其超类的必需成员

这是我选择的一个示例,因为该类目前非常轻便,因此易于发布。

class InfoBar: SKSpriteNode  { //Error message here

    let team: Team
    let healthBar: SKSpriteNode

    init(team: Team, size: CGSize) {
        self.team = team
        if self.team == Team.TeamGood {
            healthBar = SKSpriteNode(color: UIColor.greenColor(), size:size)
        }
        else {
            healthBar = SKSpriteNode(color: UIColor.redColor(), size:size)
        }
        super.init(texture:nil, color: UIColor.darkGrayColor(), size: size)

        self.addChild(healthBar)

    }

}

所以我的问题是,为什么我会收到此错误,我该如何解决?我没有执行什么?我正在呼叫指定的初始化程序。


阅读 232

收藏
2020-07-07

共1个答案

一尘不染

来自开发人员论坛上的Apple员工:

“向编译器和内置程序声明您确实不希望与NSCoding兼容的方法是执行以下操作:”

required init(coder: NSCoder) {
  fatalError("NSCoding not supported")
}

如果您知道自己不想遵守NSCoding,则可以选择这种方法。我已经在很多SpriteKit代码中采用了这种方法,因为我知道我不会从情节提要中加载它。


您可以采用的另一种效果很好的方法是将该方法实现为一种方便的初始化,如下所示:

convenience required init(coder: NSCoder) {
    self.init(stringParam: "", intParam: 5)
}

请注意中对初始化程序的调用self。与所有非可选属性相反,这使您只需要对参数使用伪值,同时避免引发致命错误。


第三个选项当然是在调用super时实现该方法,并初始化所有非可选属性。如果对象是从情节提要中加载的视图,则应采用以下方法:

required init(coder aDecoder: NSCoder!) {
    foo = "some string"
    bar = 9001

    super.init(coder: aDecoder)
}
2020-07-07