Swift便利构造器convenience init
Swift便利构造器convenience init

Swift便利构造器convenience init

在 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 提供了一种灵活的方法来扩展初始化逻辑,而不会破坏类的核心初始化规则。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注