我正在制作一个小的自定义键盘,我在类中有一组变量,需要在'覆盖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()'功能?这让我疯了。
答案 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
。