面向协议开发之:使用协议为原生类增加方法

  • 需求:为UIView增加一个方法,调用方法时控制一个label的显示与消失

  • 思路:为UIView添加一个协议,就可以直接使用view去调用协议里的方法

首先,我们先创建一个protocol,起个名字

    protocol ShowTextable {
    }

既然我们要控制一个label的显示,那么首先要有一个父视图

protocol ShowTextable {
    var backgroundView : UIView { get }
}

创建一个父视图,因为protocol里只能声明,实现需要写在extension里

extension ShowTextable {
    var backgroundView : UIView {
        return UIApplication.shared.keyWindow!
    }
}

这里默认父视图为keyWindow

现在我们需要一个全局的label,和一个shouText和hideText方法
注意:此处的label需要写在protocol外部,因为写在内部的话每次使用label都会重复创建

private let label : UILabel = {
    return UILabel()
}()

protocol ShowTextable {
    var backgroundView : UIView { get }
    
    func showText(text: String?)
    
    func hideText()
    
}

extension ShowTextable {
    var backgroundView : UIView {
        return UIApplication.shared.keyWindow!
    }
    
    func showText(text: String? = "defaultText"){
        label.frame = CGRect(x: 50, y: 50, width: 100, height: 30)
        label.text = text
        backgroundView.addSubview(label)
    }
    
    func hideText() {
        label.removeFromSuperview()
    }
    
}

现在个协议已经完成了,我们需要让UIView去遵循这个协议

extension UIView : ShowTextable {}

还有最后一步,就是当UIView遵循这个协议的时候,让backgroundView为这个UIView的实例

extension ShowTextable where Self : UIView {
    var backgroundView: UIView { return self }
}

这样就可以直接用view实例去调用showText和hidtext方法了!!

你可能感兴趣的:(面向协议开发之:使用协议为原生类增加方法)