0

我尝试理解和应用面向协议的编程,但不确定我是否朝着正确的方向前进。

需要 @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()
    }
}
4

0 回答 0