【发布时间】:2015-08-20 17:59:47
【问题描述】:
在 swift 中有指定初始化程序的概念(我假设这是我们从其他语言中知道的“普通”构造函数)。
但是还有一个叫做 Convenience Initializer 的东西,我确实知道如何编写,但我失去了重点。
如题,如果我理解正确的话,不写关键字convenience也能达到同样的效果吗?
【问题讨论】:
标签: ios swift initialization swift2 convenience-methods
在 swift 中有指定初始化程序的概念(我假设这是我们从其他语言中知道的“普通”构造函数)。
但是还有一个叫做 Convenience Initializer 的东西,我确实知道如何编写,但我失去了重点。
如题,如果我理解正确的话,不写关键字convenience也能达到同样的效果吗?
【问题讨论】:
标签: ios swift initialization swift2 convenience-methods
据我了解,这些初始化程序的唯一要点是方便。有时会发生这种情况,我们经常需要一遍又一遍地创建一些具有相同参数的对象。在这种情况下,我们可以添加另一个 init 方法,它需要更少的参数,其余的都是硬编码的。
例如一些 Logger 类
init(type: LoggerType, filepath: String, configurations: LoggerConfig, etc.)
可能是我们经常使用带有相同参数的这个记录器。为了避免重复代码,我们可以添加一个带有一些默认值的便利初始化器
convenience init(){
self.init(type: LoggerType.SomeType, filepath: "/log", configurations: LoggerConfig.Default)
}
【讨论】:
其实很容易理解:它们是带有默认参数的初始化器。
来自docs:
便利初始化器是次要的,支持类的初始化器。您可以定义一个便利初始化程序,以从与便利初始化程序相同的类中调用指定初始化程序,并将一些指定初始化程序的参数设置为默认值。您还可以定义便利初始化程序来为特定用例或输入值类型创建该类的实例。
例子:
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关键字标记你的初始化器,否则会编译错误。所以你不能从同一个类中链接两个指定的初始化器。
【讨论】:
You do not have to provide convenience initializers if your class does not require them. Create convenience initializers whenever a shortcut to a common initialization pattern will save time or make initialization of the class clearer in intent.
convenience 也一样,这是困扰我的主要问题,我怀疑我在这里遗漏了一些东西。
convenience。