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

NJa*_*anf 9 xcode overriding initialization ios swift

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

class KeyboardViewController: UIInputViewController {

var button01: CharacterButton
var button02: CharacterButton
...
Run Code Online (Sandbox Code Playgroud)

override init()   {

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

        super.init()
}
Run Code Online (Sandbox Code Playgroud)

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

required init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder)
}
Run Code Online (Sandbox Code Playgroud)

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

属性'self.button01'未在super.init调用时初始化

当我已经初始化'button01'并在前'覆盖init()'函数中调用'super.init()'时,为什么会发生这种情况?这让我疯了.

Ivi*_* M. 7

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

class KeyboardViewController: UIInputViewController {

    var button01 = CharacterButton.createButton("Q", labelOfButton: "Q")
    var button02  = CharacterButton.createButton("W?", labelOfButton: "W")
}
Run Code Online (Sandbox Code Playgroud)

编辑:

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


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

    class KeyboardViewController: UIInputViewController {

    ...

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

我不喜欢这个解决方案,因为它打破了超类对实现NSCoding的承诺,但它"有效".最后,您可以使您的属性成为隐式解包的选项.

class KeyboardViewController: UIInputViewController {

    var button01: CharacterButton!
    var button02: CharacterButton!

    ...
}
Run Code Online (Sandbox Code Playgroud)

但如果你这样做,你的init(coder:)意志就会变得不安全,所以最好fatalError从那里投掷并坚持非选择性.