Swift3 使用协议覆盖UIButton backgroundColor属性

Swift3 使用协议覆盖UIButton backgroundColor属性,swift3,storyboard,uikit,swift-protocols,Swift3,Storyboard,Uikit,Swift Protocols,我有一个协议,比如 protocol ButtonPresentable { var backgroundColor: UIColor { get } } extension ButtonPresentable { var backgroundColor: UIColor? { return UIColor.red } } 我有一个button自定义类(用IB绘制),它实现了我的协议 class MyButton: UIButton, ButtonP

我有一个协议,比如

protocol ButtonPresentable {
    var backgroundColor: UIColor { get }
}

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

}
我有一个button自定义类(用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。为什么此协议不“覆盖”本机backgroundColor属性?

因为:

看看这个例子:

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
    }
  }
}

var
声明之前添加
override
关键字。你测试过这个吗?@Adolfo Nope!没用啊我错过了这个!谢谢您是否回答了我的问题:是否有一种面向协议的方式覆盖所有UIButton背景色?我理解你的例子中使用字符串,但是使用颜色,它不是用户友好的。我正在更新我的问题。从apple文档中提取的类扩展(答案中提供了链接):
扩展可以向类添加新的方便初始值设定项,但不能向类添加新的指定初始值设定项或取消初始值设定项。指定的初始值设定项和取消初始值设定项必须始终由原始类实现提供。
遗憾的是:(以这种方式使用协议太棒了!谢谢