【发布时间】:2020-06-22 23:44:37
【问题描述】:
我在这里阅读了对类似问题的回复,但我仍然对这里最好的实现方式、原因以及有什么不同感到困惑。
在这个实现中,我有两个类的初始化器
class Person1 {
var name: String
var age: Int
var nationality: String
init(name: String, age: Int, nationality: String) {
self.name = name
self.age = age
self.nationality = nationality
}
init(name:String, age: Int) {
self.name = name
self.age = age
self.nationality = "Canadian"
}
}
当我创建一个实例时,我可以选择其中一个。如果我选择第二个,我将默认国籍设置为加拿大
let p1 = Person1(name: "Stewart", age: 40)
如果我将第二个初始化器替换为以下便利初始化器,
convenience init(name: String, age: Int) {
self.init(name: name, age: age, nationality: "Canadian")
}
我可以用同样的方式创建同一个实例并得到同样的结果。那么区别是什么呢?我发现很难找到一个好的示例,其中便利初始化程序是完成创建类的特定实例的唯一方法,而第二个初始化程序无法像我在第一个示例中所做的那样完成。
【问题讨论】:
-
只有在子类化时才真正有趣。
-
为什么不简单地为您的国籍添加一个默认值?
init(name: String, age: Int, nationality: String = "Canadian") {无需创建 2 个初始化器 -
我可以这样做,但它不能回答我的问题。我正在尝试确定一种方式是否优于另一种方式。
-
@matt,所以你的意思是在我的实现中,一种方式与另一种方式一样好,因为除非我将类子类化,否则它没有区别?
-
这并没有足够引人注目的差异来引起人们的兴趣。您是在说“它们之间没有什么可以选择的”。你是对的,因为在你使用的例子中,这是一个品味问题。但是,如果我们是子类化或被子类化,初始化器是指定初始化器还是便利初始化器会产生巨大的差异。
标签: swift class initializer convenience-methods