隐含构造器:
如果一个类,或是没有存储属性,或是已经初始存储属性在声明中,并且没有显式构造器,那么它就含有一个隐含构造器init( )。
指定构造器:
默认情况下,类的构造器是指定构造器。
只要一个类含有“没有在声明中初始化的存储属性”,那么这个类至少需要一个指定构造器。而且当这个类产生实例的时候,必须调用这些指定构造器中的一个,以初始化所有的储存属性。一个指定构造器可能不会委托此类中的其他构造器;对于指定构造器,使用self.init(...)是不合法的。
便利构造器:
关键字 convenience来标记便利构造器。
它是一个委托构造器。所以必须包含self.init(...)。
其必须调用一个本类中的指定构造器,或者本类中的便利构造器(这样就形成了构造器链),不管如何链的最后需要一个指定构造器来结束。
//... 例子略
应该注意到:一个构造器可以“说”什么和什么时候“说”的规则依然适用。一个指定构造器除初始化属性外不可以调用self,除非该类的所有属性已经初始化完毕。而便利构造器是一个委托构造器,所以直到它调用完一个指定构造器才能使用self(而且不能够设置一个不可改变属性)