Swift确实区分了指定初始化器和方便初始化器。然而,文档从未说明为什么要进行这种区分。
从程序员的角度来看,这似乎是一个额外的负担:我必须考虑一些初始化机制是“指定的”还是“方便的”,甚至还有一些实际的不便,比如I cannot call a convenience constructor of the super class,这有时可能是完全合适的。作为回报,这个概念必须有一些优势。否则苹果就不会推出这项功能了。那么,在Swift中引入这种区别的原因是什么?引用官方声明会更好。
发布于 2014-07-12 17:54:40
指定的初始化器和方便的初始化器之间的区别并不是新的- it's been part of the Cocoa environment for a long time。此约定的原因是确保在子类或类外部的代码开始尝试使用它之前,类管理的所有内部状态都按预期进行了配置。
显式初始化是Swift的“安全”特性之一。如果在Swift中声明一个变量,那么在Swift中声明一个变量就必须有一个值。(可选选项可以让您在明确表示这一点的同时对此稍加掩饰。)将Cocoa的初始化器链接约定变成一个需求是Swift在类继承之上确保初始化安全性的方式。
但不要相信我的话。< /LeVar>在WWDC - check the videos的Swift系列演讲中对此有很好的解释。
发布于 2014-07-12 10:34:19
完全同意实践中的不便,不能调用超类的方便构造函数是一个很糟糕的问题。
虽然我没有任何“正式”的答案,但我得出的结论是,调用指定的构造函数是未来唯一的证明方法。
方便的构造函数总是有可能在未来的API版本中被更改,所以让你的类的初始化依赖于一个构造函数是非常不安全的,而指定的初始化器总是可以工作的,无论API在此过程中会经历什么变化……
https://stackoverflow.com/questions/24711928
复制相似问题