遍历构造函数在类别中使用比较常见,如在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)