• 29.怎样扩展现有类功能?


      实际项目开发中,我们经常会需要对系统的UI控件等进行封装,以达到统一修改、重复代码少、复用性高等效果。OC中,我们一般通过Category来给现有类添加方法;而在Swift中,我们使用Extension来扩展现有类的功能。

    1.先看一个完整的扩展示例

    import UIKit
    
    extension UILabel
    {
        /**
         创建UILabel
         
         - parameter text:        标题
         - parameter textColor:   标题颜色
         - parameter font:        标题字体
         - parameter superView:   父视图
         - parameter constraints: 约束
         
         - returns: UILabel
         */
        static func gof_labelWithText(text: String? = nil, textColor:UIColor? = nil, font: UIFont? = nil, superView: UIView? = nil, constraints: GofConstraintMaker? = nil) -> UILabel
        {
            let label = UILabel();
            label.backgroundColor = kCColor;
            label.text = text ?? "";
            label.textColor = textColor ?? kBColor;
            label.font = font ?? kBodyFont;
            label.textAlignment = .Left;
            label.numberOfLines = 1;
            
            if superView != nil
            {
                superView?.addSubview(label);
                
                if constraints != nil
                {
                    label.snp_makeConstraints(closure: { (make) in
                        constraints!(make);
                    })
                }
            }
            
            return label;
        }
    }

      【注意】:需要注意一下这里的方法参数,都是可选类型,并赋了默认值,这意味着在调用的时候可以不用传递该参数。

    2.示例说明

    • 上面的封装提供统一的创建UILabel方法;
    • GofConstraintMaker的定义可查看第27章内容,需要添加SnapKit库
    • 使用方式如下:
            //完整参数调用
            let label1 = UILabel.gof_labelWithText("完整调用", textColor: gof_ColorWithHex(0xff0000), font: kBodyFont, superView: self.view) { (make) in
                make.left.top.equalTo(10);
                make.right.equalTo(-10);
                make.height.equalTo(30);
            }
            
            //没有字体颜色参数
            let label2 = UILabel.gof_labelWithText("没有字体颜色", font: kNavFont, superView: self.view) { (make) in
                make.left.equalTo(10);
                make.right.equalTo(-10);
                make.top.equalTo(label1.snp_bottom).offset(10);
                make.height.equalTo(30);
            }
            
            //没有字体参数
            UILabel.gof_labelWithText("没有字体", textColor: gof_ColorWithHex(0x0000ff), superView: self.view) { (make) in
                make.left.equalTo(10);
                make.right.equalTo(-10);
                make.top.equalTo(label2.snp_bottom).offset(10);
                make.height.equalTo(30);
            }  

      类似的,大家可以自己尝试实现其他常用控件的扩展。

  • 相关阅读:
    [Python] 糗事百科文本数据的抓取
    [Python] 文件扫描
    [Python] 根据博客园用户名抓取其所有文章的标题及其链接
    ParagraphString
    IrregularGridCollectionView处理不定宽度的标签cell
    Java多线程与并发
    设计模式之代理模式
    javascript设置百分比保留两位小数。
    Java基础知识总结(异常机制、集合、JUC、IO)
    Java底层知识JVM、GC
  • 原文地址:https://www.cnblogs.com/LeeGof/p/5684635.html
Copyright © 2020-2023  润新知