我在this answer中看到用户指定了convenience required init()
。这究竟是什么意思?
我知道required
关键字用于覆盖超类的指定初始值设定项,但convenience required
声明用户做了什么?
答案 0 :(得分:22)
一个方便的初始化程序是一个初始化程序,它强制执行所有子类但不是指定的初始化程序。这意味着所述初始化程序最终将在其初始化链中调用指定的初始化程序。
指定的初始化程序是类的规范初始化程序,以及所有必需和便利初始化程序应调用的程序。 Docs说:
指定的初始值设定项是类的主要初始值设定项。一个 指定的初始化程序完全初始化所引入的所有属性 该类并调用适当的超类初始化程序继续 初始化过程超级链。
便捷初始化器是一种初始化器,可以方便地在类上设置某些配置信息。文档:
便利初始化程序是次要的,支持a的初始化程序 类。您可以定义一个便捷初始化程序来调用指定的 初始化程序与便捷初始化程序所在的类相同 一些指定的初始化程序的参数设置为默认值。 您还可以定义一个便利初始化程序来创建一个实例 特定用例或输入值类型的类。
如果您的课程没有,您不必提供便利初始化程序 不要求他们。每当快捷方式创建便利初始化程序 一个普通的初始化模式将节省时间或使 意图清除类的初始化
必需的初始值设定项可以被认为是父接口和后续子类之间的绑定契约。它是您强制执行所有孩子都知道并实施一组初始化者的手段。
在定义类之前编写必需的修饰符 初始化程序,表示该类的每个子类都必须 实现初始化程序:
答案 1 :(得分:0)
类初始化程序可以用required
标记,以指示该类的每个子类都必须实现该初始化程序。
作为子类,您可以使用指定的初始值设定项或便捷初始值设定项来满足此要求。
答案 2 :(得分:0)
声明所需的类初始化作为方便允许子类easily inherit,从而省略其实现
protocol P {
var some: Int! {get}
init(some: Int)
}
class C: P {
private(set) var some: Int!
convenience required init(some: Int) {
self.init()
self.some = some
}
}
class D: C {
// no need in required init(some: Int)...
}