Swift:使用便利初始化程序和指定的初始化程序初始化超类之间的区别

时间:2018-01-18 09:20:55

标签: swift

假设我有一个类Dog声明如下:

class Dog {
    let variable1: String
    let variable2: Int

    init(variable1: String, variable2: Int) {
        self.variable1 = variable1
        self.variable2 = variable2
    }
}

ChowChowDog的子类,故意声明为空,如下所示:

class ChowChow: Dog {}

所以我们假设现在我想在子类ChowChow中添加一个初始化器。

我的问题是:为子类ChowChow创建便利初始化程序之间的区别是什么(<)如果有的话:

class ChowChow: Dog {
    convenience init() {
        self.init(variable1: "value1", variable2: 2)
    }
}

指定子类ChowChow的初始值设定项?:

class ChowChow: Dog {
    init() {
        super.init(variable1: "value1", variable2: 2)
    }
}

使用以下测试,我可以看到两种实现的结果相同:

let chowchow = ChowChow()
print(chowchow.variable1) // Prints "value1"
print(chowchow.variable2) // Prints "2"

提前谢谢你的光线!

1 个答案:

答案 0 :(得分:1)

关于基本的Swift 4.0规范,指定和便利初始化程序之间的相同差异适用于任何其他情况。

此处使用的点数:

  • 便利初始化程序必须调用其他初始化程序并最终调用指定的初始化程序
  • 指定的初始值设定项必须且只能调用超类初始值设定项(如果有)
  • 默认情况下,子类不从超类继承指定的初始值设定项。假设您为在子类中引入的任何新属性提供默认值,如果您的子类未定义任何指定的初始值设定项,则它会自动继承其所有超类指定的初始值设定项。 (见Automatic Initializer Inheritance

在你的例子中:

class ChowChow: Dog {
    convenience init() {
        self.init(variable1: "value1", variable2: 2)
    }
}

你没有向ChowChow子类引入任何指定的初始化器,因此,超类中的所有指定初始化器都是继承的(即init(variable1:variable2))。由于方便初始值设定项必须最终调用指定的初始值设定项,因此从便捷初始化程序中调用继承的self.init(variable1: "value1", variable2: 2),请注意自己。

在你的第二个例子中:

class ChowChow: Dog {
    init() {
        super.init(variable1: "value1", variable2: 2)
    }
}

您将指定的初始值设定项init()引入子类。默认情况下,指定的初始值设定项不会在子类中继承,除非满足某些条件(如第一个示例中所示)。因此,在这种特定情况下,子类ChowChow只有一个指定的初始值设定项init()而没有别的,因为指定的初始值设定项必须从超类调用指定的初始值设定项,你可以调用超类的super.init(variable1: "value1", variable2: 2),注意超级这里。 / p>

有关详细信息,请参阅:Initializer Inheritance and Overriding