零,构造函数
1,一种特殊的函数
2,主要用来在创建对象是,初始化对象
3,给对象的成员变量设置初始值
4,Swift支持函数重载,所有构造函数都是init
5,作用是分配空间,设置初始值
注意:
1,oc的初始化是从类继承关系链,从父类开始逐级向子类初始化
2,swift的初始化,是先从子类开始,逐级向父类初始化
3,非optional属性,都必须要在构造器中设置初始值,从而保证对象在被实例化的时候,属性都被正确的初始化
4,在调用父类构造函数之前,必须保证本类的属性已经完成初始化
5,swift中的构造函数不用写func关键字
6,默认的构造函数不能给本类的属性分配空间
7,如果重载了构造函数,并且没有实现父类的init方法,系统不再提供init函数(默认会提供的)
一,构造器分两类:
1,指定构造器;
2,便利构造器;
二,每一个类至少有一个指定构造器(子类默认有一个)
1,指定构造器是类的主要构造器,初始化的所有属性,要在指定构造器赋值,并且要在当前构造器中,调用父类合适的指定构造器
三,便利构造器是类的次要构造器,你需要让便利构造器去调用同一个类中的指定构造器,并将这个指定构造器中的参数填上你想要的默认参数
Init 方法必须遵循几条规则:
1,指定构造器必须调用他直接父类的指定构造器;
2,便利构造器必须调用同一个类中的其它初始化方法;(初始化方法可以是便利构造器,也可以是指定构造器,归结是必须要调用到指定构造器);
3,便利构造器在最后必须调用本类的指定构造器;(如果本类没有指定构造器,那么就要调用本类的默认指定构造器)
4,只有指定构造器才可以调用父类指定构造器,而便利构造器是不可以的
init 机制:
1,第一阶段实例的所有属性被初始化;
2,第二阶段实例的所有属性可以再次调整以备之后使用
Swift 的编译器会对初始化的方法进行安全地检查以保证实例的初始化可以被安全正确的执行:
1,指定构造器必须确保所有被类中提到的属性在代理向上调用父类的指定构造器前被初始化,之后才能将其它构造任务代理给父类中的构造器
2,指定构造器必须先向上代理调用父类中的指定构造器,然后才能为任意属性赋值
3,便利构造器必须先调用一个类中的其它构造器,然后才可以为属性赋值
4,构造器在第一阶段构造完成之前,不能调用任何实例方法,不能读取任何实例属性的值,self不能被引用。
阶段一:简单说是,子类属性都已经赋值,完成内存的初始化,然后向上(父类—>子类链),重复子类的操作,直到构造器链的最顶部,所有的属性以及内存被完全初始化,才进入阶段二
阶段二:从顶部构造器链向下,每个构造器链中类的指定构造器都有机会进一步定制实例。构造器此时可以访问self,它的属性并调用实例方法等。。
简单的说是,代码里面,便利构造器调用父类指定构造器之前,不能使用self,属性及方法的调用,如果是本类的指定构造器,self和属性可以在调用父类指定构造器之前调用,但是实例方法,必须要在调用父类指定构造器之后才可以调用
Init 的继承与重载
Swift中子类不会继承来自父类的所有构造器,这样可以防止错误的继承并使用父类的构造器生成错误的实例
关于init的继承:
1,如果子类没有定义指定构造器,默认会继承父类所有的指定构造器
2,如果子类提供了所有父类指定构造器的实现,它将自动继承所有父类的便利构造器
参考:
1,重点在论述,比较全面:https://my.oschina.net/hejunbinlan/blog/470123
2,有代码演示:https://www.cnblogs.com/Alex-sk/p/5528760.html
网友评论