/* 构造函数 init
init函数,没有返回值,不能用func修饰,不能通过实例调用init,只能用init调用其他重载的init。
✨关于override的特殊规定,普通方法必须override,指定构造必须override,便利构造不能写override修饰符。
当override一个required的构造函数时,不需要写override。override一个required的构造时,所有子类都需要加required。
required构造函数,可以通过继承获得,而不需要一定去重写。但是只要写了,必须加required。
另外,required只能用于init函数。
✨在定义了自己的指定init后,默认的init就没有啦
init函数结构体,枚举都可以有。但是deinit析构函数只能在类中才能有。
实例创建前,必须对所有的stored property进行初始化,这个可以在定义变量的时候赋初值
也可以在init函数中进行。
如果没有特殊需求,请在变量定义的时候初始化。在init中初始化的好处是,
1)可以在不同的重载函数init中初始化不同的值
2)在类继承的时候可以对初始化值进行修改。
3)另外,在定义时初始化 和 init中初始化都不会触发property observer
4)在初始化函数中可以对const的变量进行重新赋初值。
在init中调用其他的self.init(必须加self)函数时,称为initializer delegation初始化代理
✨✨✨值类型的构造函数之间没有特殊规定。(结构体等),但是类中的init函数分为指定构造和便利构造。
类中因为多了继承的原因,为了保证所有的属性都被初始化,特做了如下规定:
构造其分为 Designated(指定,特定) initializer,convenience initializer:
1.若有父类,并且子类实现了指定构造器,必须在指定构造器中的初始化阶段1(所有子类属性初始化,见官网定义)最后调用super.init()
2.便利构造函数必须调用同一类中定义的其他构造器。包含指定构造器和便利构造器(该构造器调用了指定构造器)。
3.init函数可以调用instanceMethod,也可以对属性赋值,但是不可以在初始化阶段1(所有的变量都被初始化)之前。
✨✨总则:指定构造器必须向上代理。便利构造器必须横向代理(必须调用一个指定构造器结束)。
关于子类的继承(自己的理解):
1.在