使用协议覆盖UIButton backgroundColor属性

时间:2017-02-07 10:57:14

标签: swift3 storyboard uikit swift-protocols

我有像

这样的协议
protocol ButtonPresentable {
    var backgroundColor: UIColor { get }
}

extension ButtonPresentable {
    var backgroundColor: UIColor? {
        return UIColor.red
    }

}

我有一个实现我的协议的按钮自定义类(用IB绘制)

class MyButton: UIButton, ButtonPresentable {
}

为什么此协议不会“覆盖”原生backgroundColor属性?

我希望有一个默认协议实现,它将为所有按钮设置默认背景。是否有面向协议的方法将默认值设置为所有UIButton背景颜色?

编辑:其实我这样做

protocol ButtonPresentable {
    var pBackgroundColor: UIColor { get }
}

extension ButtonPresentable {
    var pBackgroundColor: UIColor? {
        return UIColor.red
    }

    func applyTheme() {
        self.backgroundColor = pBackgroundColor
    }
}

// In my custom view
required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    self.applyTheme()
}

1 个答案:

答案 0 :(得分:1)

<强> 1。为什么这个协议没有“覆盖”原生backgroundColor属性?

因为: Extensions can add new functionality to a type, but they cannot override existing functionality.

看看这个例子:

protocol ButtonProtocol {
  var name: String { get }
}

extension ButtonProtocol {
  var name: String {
    return "button protocol"
  }
}

class ButtonClass: ButtonProtocol {
  var name: String = "button class"
}

let button = ButtonClass()
print(button.name) // prints: button class

<强> 2。是否有面向协议的方法将默认值设置为所有UIButton背景颜色?

如果你想覆盖所有按钮的backgroundColor,你可以这样做:一旦按钮设置了它的框架,你可以覆盖它的背景颜色:

extension UIButton {
  open override var frame: CGRect {
    didSet {
      self.backgroundColor = .red
    }
  }
}