Swift中重写的属性问题

我有一个UIButton的子类如下:

class VectorizedButton: UIButton {

    override var highlighted: Bool {
        didSet {
            setNeedsDisplay()
        }
    }

}

一切都很好,直到我在根控制器中添加了这一行:

var twitterButton: TwitterButton?

TwitterButton扩展了VectorizedButton.

这是我得到的错误:

…UIView+Vectorized.swift:42:7: Class ‘VectorizedButton’ has no initializers
…UIView+Vectorized.swift:44:18: Stored property ‘highlighted’ without initial value prevents synthesized initializers

很简单,让我们设置一个默认值:

override var highlighted: Bool = false

更严重的错误:

<unknown>:0: error: super.init called multiple times in initializer
<unknown>:0: error: super.init called multiple times in initializer
<unknown>:0: error: super.init called multiple times in initializer

尝试重写init?

required init(coder aDecoder: NSCoder) {
    highlighted = false
    super.init(coder: aDecoder)
}

更多错误:

error: 'self' used before super.init call
    highlighted = false
                ^
error: 'self' used before super.init call
    highlighted = false
    ^

有人在乎解释这里发生了什么吗?

最佳答案 您只需添加所需的init

这是我做的:

class VectorizedButton: UIButton {

  override var highlighted: Bool {
    didSet {
        setNeedsDisplay()
    }
  }

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

}

class TwitterButton: VectorizedButton {

}

在ViewController中:

var twitterButton: TwitterButton?

像这样工作得很好.

您想要覆盖突出显示的属性并将twitterButton创建为Optional,因此您需要在类中实现init.

您无法使用以下方法设置突出显示的属性:

override var highlighted: Bool = false

你需要在init中设置它,或者像这样:

override var highlighted: Bool {

    get { return false }
    set { super.highlighted = newValue }
}

为此:

required init(coder aDecoder: NSCoder) {
  highlighted = false
  super.init(coder: aDecoder)
}

您需要在调用super.init后设置属性.

点赞