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);
        }  

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

原文地址:https://www.cnblogs.com/LeeGof/p/5684635.html