在swift中有指定初始化程序的概念(我假设这是我们从其他语言中知道的“正常”构造函数)。
但是还有一个叫做 Convenience Initializer 的东西,我确实知道如何编写它,但是我失去了重点。
因为,如果我理解正确,你可以在不写关键字的情况下实现同样的事情convenience
,或者不是?
2 回答
据我了解,这些初始化程序的唯一要点是方便。有时会发生这种情况,我们经常需要一遍又一遍地创建一些具有相同参数的对象。在这种情况下,我们可以添加另一个 init 方法,它需要更少的参数,其余的都是硬编码的。
例如,一些 Logger 类
init(type: LoggerType, filepath: String, configurations: LoggerConfig, etc.)
可能是我们经常使用带有相同参数的这个记录器。为了避免重复代码,我们可以添加一个带有一些默认值的便利初始化器
convenience init(){
self.init(type: LoggerType.SomeType, filepath: "/log", configurations: LoggerConfig.Default)
}
实际上很容易理解它们:它们是具有默认参数的初始化器。
从文档:
便利初始化器是次要的,支持类的初始化器。您可以定义一个便利初始化程序,以从与便利初始化程序相同的类调用指定初始化程序,并将一些指定初始化程序的参数设置为默认值。您还可以定义便利初始化程序来为特定用例或输入值类型创建该类的实例。
例子:
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
,否则会编译器错误。所以你不能从同一个类中链接两个指定的初始化器。