convenience 便利构造函数
目的
条件判断,只有满足条件,才实例化对象,可以防治造成不必要的内存开销
简化对象的创建
本身不负责属性的创建和初始化工作
特点
默认情况下,所有的构造方法都是指定构造函数 Designated
convenience 关键字修饰的构造方法就是便利构造函数
便利构造函数具有以下特点:
可以返回 nil
只有便利构造函数中可以调用 self.init()
便利构造函数不能被重载或者 super
便利构造函数主要用于条件监测或者简化对象创建
/**
便利构造函数的目的:
1. 条件判断
2. 简化对象的创建
3. 本身不负责属性的创建和初始化工作
*/
convenience init?(dict: [String: AnyObject]) {

// 判断是否包含姓名
guard let _ = dict[“name”] as? String else {
printLog(“没有指定姓名”)
return nil
}
guard let age = dict[“age”] as? Int else {
printLog(“没有指定年龄”)
return nil
}

if age > 100 || age < 0 {
printLog(“年龄不正确”)
return nil
}

// Convenience initializer for ‘Person’ must delegate (with ‘self.init’) rather than chaining to a superclass initializer (with ‘super.init’)
// 遍历构造函数必须调用本类的 self.init,而不能调用父类的 super.init
self.init()

printLog(self.classForCoder)

// Use of ‘self’ in method call ‘setValuesForKeysWithDictionary’ before super.init initializes self
// 使用 self 调用 setValuesForKeysWithDictionary 之前需要调用 super.init 方法
// 只有确保对象已经被正确的实例化之后,才能向对象发送消息
setValuesForKeysWithDictionary(dict)
}
便利构造函数应用场景
根据给定参数判断是否创建对象,而不像指定构造函数那样必须要实例化一个对象出来
在实际开发中,可以对已有类的构造函数进行扩展,利用便利构造函数,简化对象的创建
构造函数小结
指定构造函数必须调用其直接父类的的指定构造函数(除非没有父类)
便利构造函数必须调用同一类中定义的其他指定构造函数或者用 self. 的方式调用父类的便利构造函数
便利构造函数可以返回 nil
便利构造函数不能被重载