在 Swift 中,convenience init 是一种便利构造器(convenience initializer)。它是一种特殊的构造器,用来简化初始化过程。与指定构造器(designated initializer)相比,便利构造器有以下特点和用途:
便利构造器的特点
1、不能直接调用父类的构造方法:
便利构造器必须通过调用同一类型中的其他构造器(最终调用到指定构造器)来完成初始化工作。
2、不能被子类继承或重写:
便利构造器只能定义在当前的类或结构体中,子类无法继承或覆盖父类的便利构造器。
3、用法受限于指定构造器:
如果需要直接处理类的所有属性,或者要初始化父类的属性,需要用指定构造器(init)。
便利构造器的语法
convenience init(parameters) {
self.init(...) // 必须调用同类中的其他构造器
// 进一步定制初始化逻辑
}
convenience init 的用途
1、提供更方便的初始化方法:
便利构造器常用于封装一些复杂的初始化逻辑,或为现有的指定构造器提供更便捷的接口。
2、扩展现有类型:
当我们通过扩展(extension)为现有的类或结构体添加构造器时,只能添加便利构造器,不能添加指定构造器。因为指定构造器需要直接操作存储属性,而扩展不能直接为类型添加存储属性。
使用场景
convenience init 常用于:
1、提供默认参数。
2、为常用初始化模式提供简化方法。
代码示例
class Person {
var name: String
var age: Int
// 指定构造器
init(name: String, age: Int) {
self.name = name
self.age = age
}
// 便利构造器
convenience init(name: String) {
self.init(name: name, age: 0) // 调用指定构造器
}
// 另一个便利构造器
convenience init() {
self.init(name: "Unknown") // 调用另一个便利构造器
}
}
// 使用指定构造器
let person1 = Person(name: "Alice", age: 30)
// 使用便利构造器
let person2 = Person(name: "Bob")
let person3 = Person()
上图为第一个便利构造器(convenience init(name: String))的流程图。
实例应用
extension UIColor {
convenience init(red: Int, green: Int, blue: Int) {
self.init(
red: CGFloat(red) / 255.0,
green: CGFloat(green) / 255.0,
blue: CGFloat(blue) / 255.0,
alpha: 1.0
)
}
}
convenience init 的作用:
提供了一种用整数(Int)值创建颜色的简便方式,而无需手动将 RGB 值除以 255。
调用流程:
self.init 调用了 UIColor 的指定构造器 init(red:green:blue:alpha:)。
便利构造器通过简单的逻辑(CGFloat(red) / 255.0)完成了初始化过程。
总结
1、必须用 convenience 关键字标记。
2、只能在类中使用(结构体和枚举不支持)。
3、必须通过调用同类的其他构造器间接完成实例的完整初始化。
通过这种方式,convenience init 提供了一种灵活的方法来扩展初始化逻辑,而不会破坏类的核心初始化规则。