我尝试理解和应用面向协议的编程,但不确定我是否朝着正确的方向前进。
需要 @objc 关键字的方法不能放在协议扩展中,所以我看到其他人使用类的标准扩展。这是正确的方法吗?
此外,对于一个类的标准方法,将它们放在单独的协议中通常是一种好习惯,还是最好将它们放在自己的类中?
//***************************************************************
protocol HasRoundedCorners where Self : UIView {}
extension HasRoundedCorners {
func setCorners() {
layer.cornerRadius = frame.size.height/5
}
}
protocol HasCustomcolor where Self : UIView {}
extension HasCustomcolor {
func setColor() {
backgroundColor = .cyan
}
}
//cannot use @objc methods so for this kind of func, I need extension
//***************************************************************
protocol HasTouchGesture where Self : UIView {
func addTapGesture()
func myMethod()
}
extension MyRoundedAndColouredView: HasTouchGesture {
func addTapGesture() {
let keyboardDismissGesture = UITapGestureRecognizer(target: self, action: #selector(self.myMethod))
self.addGestureRecognizer(keyboardDismissGesture)
}
@objc func myMethod() {
print("tapped")
}
}
//***************************************************************
class MyRoundedView: UIView, HasRoundedCorners {
override init(frame: CGRect) {
super.init(frame: frame)
setCorners()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setCorners()
}
}
class MyCyanView: UIView, HasCustomcolor {
override init(frame: CGRect) {
super.init(frame: frame)
setColor()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setColor()
}
}
class MyRoundedAndColouredView: UIView, HasRoundedCorners, HasCustomcolor {
override init(frame: CGRect) {
super.init(frame: frame)
setCorners()
setColor()
addTapGesture()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setCorners()
setColor()
addTapGesture()
}
}