为什么Swift区分指定和便利初始化程序?

时间:2014-07-12 10:18:42

标签: constructor initialization swift

Swift确实区分了指定和便利初始化程序。但是,文档从未说明为何进行这种区分。

从程序员的角度来看,这似乎是一个额外的负担:我必须考虑一些初始化机制是否被指定为"或者"方便"甚至有一些实际的不便,比如我cannot call a convenience constructor of the super class,有时可能是完全合适的。这个概念必须具有一些优势作为回报。否则Apple将不会推出此功能。那么在Swift中引入这种区别的原因是什么?对官方声明的引用会很好。

2 个答案:

答案 0 :(得分:1)

指定的初始化程序和便利初始化程序之间的区别并不新颖 - it's been part of the Cocoa environment for a long time。此约定的原因是确保在子类或类外部的代码开始尝试使用它之前,由类管理的所有内部状态都按预期配置。

显式初始化是"安全" Swift的功能。在初始化之前使用值可能导致C中的未定义行为(读取:错误)。如果在Swift中声明变量,则必须具有值。 (Optionals让你稍微捏一下,同时仍然明确它。)将Cocoa的初始化程序链接约定为一个要求是Swift如何在类继承之上确保初始化安全性。

但请不要使用我的字。 < /莱瓦尔>在WWDC的一系列Swift讲座中对此进行了很好的解释 - 检查the videos

答案 1 :(得分:0)

完全同意实际的不便,不能称超级类的便利构造者是一个完整的PITA ......

虽然我没有任何"官方"回答,我得出的结论是,调用指定的构造函数是未来唯一可行的方法。

便利构造函数总是有可能在将来的API版本中进行更改,因此使类的初始化依赖于一个非常不安全,而指定的初始化程序总是可以工作,无论API发生什么变化一路走来......

相关问题