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.示例说明
//完整参数调用 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); }
类似的,大家可以自己尝试实现其他常用控件的扩展。
无善无恶心之体,
有善有恶意之动,
知善知恶是良知,
为善去恶是格物。