zoukankan      html  css  js  c++  java
  • 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);
            }  

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

  • 相关阅读:
    MSSQLSERVER服务无法启动的解决方案
    引用类型和原始类型的对比(java)
    MVC中关于Membership类跟数据库的问题
    ASP.NET协作应用集成到trsids身份验证服务器的开发流程
    oracle的一知半解
    辨明你所从事的软件的类型
    sql数据库之间数据的转录
    设为首页 收藏(IE可用)
    如何缩减Try{}Catch{}Finally{}代码----定义一个公用的Try{}Catch{}Finally{}
    如何判断字符串是否存在数字
  • 原文地址:https://www.cnblogs.com/LeeGof/p/5684635.html
Copyright © 2011-2022 走看看