我有这个初始化程序:
convenience required init(){
print("Creating Object")
self.init()
}
当这段代码运行时,我在控制台中看到的是一个连续的"创建对象"尽管我只创建了一个对象的实例。从打印语句中可以清楚地看出self.init()
正在调用convenience required init()
方法。当苹果明确表示:{/ p>时,为什么self.init()
会调用便利初始化程序
指定的初始化程序必须从其中调用指定的初始化程序 直接超类
答案 0 :(得分:0)
来自apple developer docummentation:
便利初始化程序是次要的,支持a的初始化程序 类。您可以定义一个便捷初始化程序来调用指定的 初始化程序与便捷初始化程序所在的类相同 一些指定的初始化程序的参数设置为默认值。 您还可以定义一个便利初始化程序来创建一个实例 特定用例或输入值类型的类。
如果您的班级不需要,您不必提供便利初始化程序。只要通用初始化模式的快捷方式可以节省时间或使类的初始化意图更清晰,就可以创建便利初始化器。
类类型的初始化程序委派
为简化指定和便利初始值设定项之间的关系,Swift在初始值设定项之间应用以下三个规则进行委托调用:
规则1 指定的初始化程序必须从其直接超类调用指定的初始化程序。
规则2 便捷初始值设定项必须从同一个类调用另一个初始值设定项。
规则3 便利初始化程序必须最终调用指定的初始化程序。
记住这一点的一个简单方法是:
指定的初始值设定项必须始终委派。 方便初始化程序必须始终委派。
因此,确保您的便利初始化程序和您所需的初始化程序没有相同的签名,目前他们这样做。这就是为什么你无休止地递归调用初始化程序