在构造器中可以使用构造代理器来完成部分构造工作,类构造器代理分为横向代理和向上代理,横向代理只能发生在同一类内部,这种构造器称为便利构造器,向上代理发生在继承的情况下,在子类构造过程中,要先调用父类构造器初始化父类的存储属性,这种构造器称为指定构造器
一、构造器调用规则
1、指定的构造器必须调用其直接父类的指定构造器;
2、便利构造器必须调用其同一类中的其他构造器;
3、便利构造器必须最终调用一个指定构造器结束;
class person { var name:String var age : Int func description()->String { return "\(name):\(age)" } convenienece init(){ self.init(name:"HEHE") self.age=10 } convenience init(name:String){ self.init(name:name,age:10) } init(name:String,age:Int){ self.name=name self.age=age }
class Studetn:Person { var school:String init(name:String,age:Int,school:String){ self.school=school super.init(name:name,age:age) } convenienece override init(name:String,age:Int){ self.init(name:name,age:age,school:"XXXX") } }
二、构造过程安全检查
1、首先分配内存,初始化子类存储属性,沿构造器链向上初始化父类存储属性,到达构造器链顶部,初始化全部的存储属性;
2、从顶部构造链往下,可以对类进行进一步的修改存储属性,调用实例方法等处理;
Swift的编译器在构造过程中可以运行一些安全检查工作,这些工作可以有效的防止属性在初始化前被访问,也可以防止属性被其它的一些构造器赋予不同的值;
安全检查1:指定构造器必须保证其所在类的所有存储属性都初始化完成,之后才能向上调用父类构造器代理;
安全检查2:指定构造器必须先调用父类构造器代理,再为继承的属性赋予新值,否则指定构造器赋予的新值都会被父类中的构造器所覆盖;
安全检查3:便利构造器必须先调用同一类中的其他构造器代理,然后再为任意属性赋新值,否则便利构造器赋予的值将被同一类中的其他指定构造器所覆盖;
安全检查4:构造器在第一阶段构造完成之前,不能调用实例方法,也不能读取实例属性;
三、构造器继承
Swift中子类构造器的来源有2种,自己编写和从父类继承,并不是所有父类的构造器都能自动继承下来,能够从父类自动继承下来的构造器,规则如下:
1、如果子类没有定义任何指定构造器,它将自动继承父类的所有指定构造器;
2、如果子类提供了所有父类指定构造器的实现,无论是通过条件1继承而来,还是自己编写,它将自动继承所有父类的便利构造器;
class Graduate:Studetn {
var special:String = ""
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。