Swift中重写的属性问题

时间:2014-11-13 13:55:37

标签: swift properties override llvm

我有UIButton的子类如下:

class VectorizedButton: UIButton {

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

}

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

var twitterButton: TwitterButton?

TwitterButton延伸VectorizedButton

这是我得到的错误:

  

... UIView + Vectorized.swift:42:7:Class' VectorizedButton'没有初始化者   ... UIView + Vectorized.swift:44:18:存储的属性'突出显示'没有初始值会阻止合成初始化器

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

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
    ^

任何人都在乎解释这里发生了什么?

1 个答案:

答案 0 :(得分:2)

您只需添加所需的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后设置属性。