便利初始化器的用例是什么?

What is the use case for convenience initializer?

在 swift 中有指定初始化器的概念(我假设这是我们从其他语言中知道的 "normal" 构造函数)。
但是还有一个叫做Convenience Initializer的东西,我确实知道怎么写,但是我失去了重点。
如,如果我没理解错的话,不用写关键词convenience也能达到同样的效果,要不?

其实很容易理解它们:它们是带有默认参数的初始化器。

来自docs

Convenience initializers are secondary, supporting initializers for a class. You can define a convenience initializer to call a designated initializer from the same class as the convenience initializer with some of the designated initializer’s parameters set to default values. You can also define a convenience initializer to create an instance of that class for a specific use case or input value type.

示例:

class A {
    var a: Int
    var b : Int

    init() {
        a = 0
        b = 0
    }

    /*convenience*/ init(a: Int) {
        self.init()
        self.a = a
    }
}

在上面的例子中,你不能调用self.init(),你已经用convenience关键字标记了你的初始化器,否则会编译错误。所以你不能从同一个 class.

链接两个指定的初始值设定项

据我了解,这些初始化程序中唯一的一点就是方便。有时会发生这种情况,我们经常需要一遍又一遍地创建具有相同参数的对象。在那种情况下,我们可以只添加另一个参数更少的 init 方法,其余参数是硬编码的。

比如一些Loggerclass

init(type: LoggerType, filepath: String, configurations: LoggerConfig, etc.)

可能是我们经常以相同的参数使用这个记录器。为了避免重复代码,我们可以添加一个带有一些默认值的便捷初始化器

convenience init(){ self.init(type: LoggerType.SomeType, filepath: "/log", configurations: LoggerConfig.Default) }