Swift:属性未在super.init调用时初始化

时间:2014-08-15 22:44:52

标签: ios xcode swift initialization override

我正在制作一个小的自定义键盘,我在类中有一组变量,需要在'覆盖init()'中进行初始化。如下所示:

class KeyboardViewController: UIInputViewController {

var button01: CharacterButton
var button02: CharacterButton
...

override init()   {

        //Initialize buttons and assign attributes
        button01 = CharacterButton.createButton("Q", labelOfButton: "Q")
        button02 = CharacterButton.createButton("W‎", labelOfButton: "W")

        super.init()
}

除此之外,我还添加了以下代码,因为从Xcode 6 beta 5开始显然需要:

required init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder)
}

但最后一段代码导致错误说:

  

Property' self.button01'没有在super.init调用

初始化

为什么会在我已经初始化' button01'并且称为'super.init()'在前者内部覆盖init()'功能?这让我疯了。

3 个答案:

答案 0 :(得分:6)

init(coder:)init()是两个不同的指定初始值。你在这里几乎没有选择。最好的方法是就地初始化你的房产。

class KeyboardViewController: UIInputViewController {

    var button01 = CharacterButton.createButton("Q", labelOfButton: "Q")
    var button02  = CharacterButton.createButton("W‎", labelOfButton: "W")
}

修改

从上面的代码中删除了初始值设定项。如果所有属性都就地初始化,则无需覆盖任何初始化程序。所有这些都将被自动继承(包括init(coder:))。


或者你可以做这样的事情,如果你的班级永远不会从笔尖创建(包括故事板:

    class KeyboardViewController: UIInputViewController {

    ...

    required init(coder aDecoder: NSCoder!) {
        fatalError("This class doesn't support NSCoding.")
    }
}

我不喜欢这个解决方案,因为它打破了超级类别'承诺实施NSCoding,但它可以正常使用#39;最后,您可以使您的属性成为隐式解包的选项。

class KeyboardViewController: UIInputViewController {

    var button01: CharacterButton!
    var button02: CharacterButton!

    ...
}

但如果你这样做,你的init(coder:)将变得不安全,所以最好从那里抛出fatalError并坚持使用非选项。

答案 1 :(得分:3)

这是因为如果使用第二个初始值设定项创建类

init(coder aDecoder: NSCoder!)

然后你的变量button01和button02永远不会被初始化。由于它们不是选项,因此编译器不允许这样做。

您可以将第二个初始值设定项更改为:

required init(coder aDecoder: NSCoder!) {
    button01 = CharacterButton.createButton("Q", labelOfButton: "Q")
    button02 = CharacterButton.createButton("W‎", labelOfButton: "W")
    super.init(coder: aDecoder)
}

或者您可以在声明变量时初始化变量:

var button01 = CharacterButton.createButton("Q", labelOfButton: "Q")
var button02 = CharacterButton.createButton("W‎", labelOfButton: "W")

答案 2 :(得分:0)

如果您对实施init(coder:)不感兴趣,则应该抛出错误。

required init(coder aDecoder: NSCoder!) {
    fatalError("use init() method")
}

我不确定系统是否会为init(coder:)子类调用UIInputViewController