十八、Swift3.0之便利构造函数

遍历构造函数在类别中使用比较常见,如在UIColor+Extension实现一个简单的遍历构造函数:

extension UIColor {
    convenience init(r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat = 1.0) {
        self.init(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: a)
    }
}

遍历构造函数目的:
1、条件判断,只有满足条件,才实例化对象,可以防止造成不必要的内存开销
2、简化对象创建
3、本身不负责属性的创建和初始化工作

遍历构造函数注意事项:
1、使用convenience关键字
2、便利构造函数允许返回nil

  • 正常的构造函数一定会创建对象
  • 判断给定的参数是否符合条件,如果不符合条件,直接返回nil,不会创建对象,减少内存开销。
    3、只用便利构造函数中,才能使用self.init 构造当前对象
  • 没有convenience关键字的构造函数式负责创建对象的,反之用来检查条件的,本身不负责对象的创建。
    4、注意init后面有?
    5、如果在遍历构造函数中使用当前对象的属性,一定要在self.init之后。
    6、在实际开发中写的很少,但是系统方法创建对象时有很多便利构造函数
class Person: NSObject {
    
    var name: String?
    var age: Int = 0
    //遍历构造函数
    convenience init?(name: String,age: Int) {
        if age > 100{
            return nil
        }
        //实例化当前对象
        self.init()
        //代码执行到此 self才允许被访问,才能够访问到对象的属性
        self.name = name
    }
}

遍历函数的实际使用案例,使用遍历构造函数是抽取UITextField控件。创建一个Swift文件,命名为UITextField+extension,然后实现如下代码。

//extension类似于OC中的Category
extension UITextField{
    convenience init(placeholder: String?, fontSize: CGFloat = 14,frame: CGRect){
        //实例化当前对象
        self.init()
        //访问属性
        self.frame = frame
        self.borderStyle = .roundedRect
        self.placeholder = placeholder
        self.font = UIFont.systemFont(ofSize: fontSize)
    }
}

外部代码调用形式。

 let tf = UITextField(placeholder: "占位文本", fontSize: 15, frame: CGRect(x: 50, y: 100, width: 100, height: 30))
        view.addSubview(tf)

你可能感兴趣的:(十八、Swift3.0之便利构造函数)