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

  • 需求:为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方法了!!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容