为什么Swift要区分指定初始化器和方便初始化器?



Swift区分了指定初始化式和方便初始化式。然而,文档从来没有说明为什么要进行这种区分。

从程序员的角度来看,这似乎是一个额外的负担:我必须考虑一些初始化机制是"指定的"还是"方便的",甚至有一些实际的不便,比如我不能调用超类的方便构造函数,而这些构造函数有时可能是完全合适的。作为回报,这个概念肯定有一些好处。否则苹果也不会推出这一功能。那么在Swift中引入这种区别的原因是什么呢?参考一下官方声明就好了。

指定初始化器和便利初始化器之间的区别并不新鲜——它已经成为Cocoa环境的一部分很长时间了。使用这种约定的原因是为了确保在子类或类外部代码开始尝试使用它之前,类管理的所有内部状态都按照预期配置。

显式初始化是Swift的"安全"特性之一。在初始化之前使用值可能会导致c中未定义的行为(读:bug)。如果在Swift中声明一个变量,它必须有一个值。(可选选项可以让你在明确说明的同时稍微回避这一点。)使Cocoa的初始化链接约定成为一项要求,是Swift在类继承之上确保初始化安全的方式。

但是不要相信我的的话。& lt;/LeVar>在WWDC的Swift系列演讲中有一个很好的解释-查看视频

完全同意实际不便,不能调用超类的方便构造函数是一个完全的PITA…

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

方便构造函数总是有可能在未来的API版本中被修改,所以让你的类的初始化依赖于一个构造函数是非常不安全的,而指定的初始化器总是会起作用的,不管API在这个过程中发生了什么变化…

最新更新