Swift 面试题
目录

Swift 中指定构造器 (Designated Initializer) 和便利构造器 (Convenience Initializer) 的区别?

· 约 3 分钟读完 · 第 93 / 196 章

推荐答案

在 Swift 中,指定构造器 (Designated Initializer) 和便利构造器 (Convenience Initializer) 的主要区别在于它们的职责和使用场景:

  • 指定构造器:是类的主要构造器,负责初始化类中所有的存储属性,并确保在初始化过程中调用父类的指定构造器(如果有父类的话)。每个类至少有一个指定构造器。

  • 便利构造器:是类的辅助构造器,用于提供额外的初始化方式。便利构造器必须调用同一个类中的指定构造器来完成初始化过程。便利构造器不能直接初始化存储属性,也不能调用父类的构造器。

本题详细解读

指定构造器 (Designated Initializer)

指定构造器是类的主要构造器,负责初始化类中所有的存储属性。它必须确保在初始化过程中调用父类的指定构造器(如果有父类的话)。指定构造器的定义如下:

在这个例子中,init(property1:property2:) 是指定构造器,它负责初始化 property1 和 property2。

便利构造器 (Convenience Initializer)

便利构造器是类的辅助构造器,用于提供额外的初始化方式。便利构造器必须调用同一个类中的指定构造器来完成初始化过程。便利构造器的定义如下:

在这个例子中,init(property1:) 是便利构造器,它调用了指定构造器 init(property1:property2:) 来完成初始化。

关键区别

  1. 职责:

    • 指定构造器负责初始化所有存储属性,并确保调用父类的指定构造器(如果有父类)。
    • 便利构造器负责提供额外的初始化方式,必须调用同一个类中的指定构造器。
  2. 调用关系:

    • 指定构造器可以直接调用父类的指定构造器。
    • 便利构造器不能直接调用父类的构造器,必须调用同一个类中的指定构造器。
  3. 使用场景:

    • 指定构造器用于主要的初始化逻辑。
    • 便利构造器用于简化初始化过程或提供默认值。

通过理解这些区别,可以更好地设计类的初始化过程,确保代码的清晰性和可维护性。