gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:42:45 25 4
gpt4 key购买 nike

我正在制作一个小的自定义键盘,我在类中有一组变量需要在“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' not initialized at super.init call

当我已经初始化“button01”并在之前的“override init()”函数中调用“super.init()”时,为什么会发生这种情况?这让我抓狂。

最佳答案

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

class KeyboardViewController: UIInputViewController {

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

编辑:

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


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

    class KeyboardViewController: UIInputViewController {

...

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

我不喜欢这个解决方案,因为它打破了父类(super class)关于实现 NSCoding 的 promise ,但它“有效”。最后,您可以使您的属性成为隐式展开的可选值。

class KeyboardViewController: UIInputViewController {

var button01: CharacterButton!
var button02: CharacterButton!

...
}

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

关于ios - Swift:属性未在 super.init 调用时初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25335239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com