我有像
这样的协议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()
}
答案 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
}
}
}