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()'时,为什么会发生这种情况?这让我疯了.
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从那里投掷并坚持非选择性.
| 归档时间: |
|
| 查看次数: |
10041 次 |
| 最近记录: |