前言:在Swift中对于控件创建时的代码抽取类似于OC中的分类,接下来看看在Swift中是如何做的
举例—
#先创建几个并排的btn
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
///调用方法
setupUI()
}
func setupUI() -> () {
let btn1 = UIButton(type: .custom)
btn1.setTitle("按钮1", for: .normal)
btn1.setTitleColor(UIColor.orange, for: .normal)
btn1.frame = CGRect(x: 50, y: 100, width: 100, height: 44)
btn1.backgroundColor = UIColor.blue
view.addSubview(btn1)
let btn2 = UIButton(type: .custom)
btn2.setTitle("按钮2", for: .normal)
btn2.setTitleColor(UIColor.orange, for: .normal)
btn2.frame = CGRect(x: 160, y: 100, width: 100, height: 44)
btn2.backgroundColor = UIColor.blue
view.addSubview(btn2)
let btn3 = UIButton(type: .custom)
btn3.setTitle("按钮3", for: .normal)
btn3.setTitleColor(UIColor.orange, for: .normal)
btn3.frame = CGRect(x: 270, y: 100, width: 100, height: 44)
btn3.backgroundColor = UIColor.blue
view.addSubview(btn3)
}
以上代码就出现了重复冗余的代码,我们接下来来抽取一下
抽取—
#首先command + N 创建一个Swift.file 命名为UIButton + extension
#其次将import Foundation 改为 import UIKit
import UIKit
// extension 类似于OC中的 categary
extension UIButton {
//便利构造函数
convenience init(title : String , titleColor : UIColor , frame : CGRect, backgroundColor : UIColor) {
//1.实例化当前对象—因为在便利构造函数中是不负责创建对象的,所以必须调用本身的构造函数来创建对象后,再做下面的事情
self.init()
//2.访问属性
self.setTitle(title, for: .normal)
self.setTitleColor(titleColor, for: .normal)
self.frame = frame
self.backgroundColor = backgroundColor
}
}
//接下来再在ViewController中再创建一个按钮用便利构造方法
let btn4 = UIButton(title: "按钮4", titleColor: UIColor.orange, frame: CGRect(x: 50, y: 150, width: 100, height: 44)
, backgroundColor: UIColor.blue)
view.addSubview(btn4)
//看起来就简单多了
#扩展—在Swift中函数可以传递默认值,对于我们写便利构造函数来创建多个类似属性控件时是一大便利,可以轻松实现控件的多属性组合
//给便利构造函数中的 backgroundColor属性设置一个默认值
convenience init(title : String , titleColor : UIColor , frame : CGRect, backgroundColor : UIColor = UIColor.black)
//接下来创建按钮时就可以不传此参数
let btn5 = UIButton(title: "按钮5", titleColor: UIColor.orange, frame: CGRect(x: 160, y: 150, width: 100, height: 44))
当然如果想要这个属性不是默认参数,直接传递就好