Swift--12构造方法
//构造方法的目的就是确保类的所有非lazy存储属性进行初始化 //可选类型的存储属性可以不用初始化(默认为nil) class Point { var x: Int = 0 var y: Int = 0 var z: Int? init () { //缺省构造方法(存储属性有初始值) print("缺省init") } //指定构造方法,内部参数名也是外部标签 init (x: Int,y: Int) { //带参的构造方法 self.x = x self.y = y print("带参init") } //便利构造方法 convenience init (x: Int) { // self.x = x // y = 100 //若想在构造方法中使用self.init,前面必须添加convenience(便利) //若构造方法前添加convenience,则方法中必须使用self.init self.init(x: x,y: 100) } convenience init (z: Int) { //便利构造方法中也可以调用其他便利构造方法 self.init(x: 50) //两段式构造方法,self的使用不能放在self.init之前 //防止出现使用未初始化变量的情况 print("遍历构造方法(x)") } func testFunc() { print("用于重写") } final func testFunc2() { print("不能被重写") } } var p1 = Point() var p2 = Point(x: 100,y: 100) var p3 = Point(x: 20) var p4 = Point(z: 100) /*继承 1、swift的继承仍然是单继承 2、构造方法无法继承,普通方法和属性都可继承 3、调用父类方法使用super关键字 4、重写父类方法使用override关键字 5、不想被重写的父类方法前加final关键字 */ class SubPoint: Point { var w: Int init(w: Int) { self.w = w //子类中必须通过父类的构造方法进行属性初始化
//两段式构造要求:只能放在子类的属性初始化之后进行调用
//子类中只能通过调用父类的指定构造方法初始化属性, super.init() //不能是遍历构造方法 //super.init(x: 100) } override func testFunc() { print("父类重写") } //子类中不能重写 //override func testFunc2() {} } /* 构造器链 为了简化指定构造器和便利构造器之间的调用关系, Swift采用以下三条规则来限制构造器之间的代理调用: 规则1:指定构造器必须调用其直接父类的的指定构造器。 规则2:便利构造器必须调用同一类中定义的其它构造器。 规则3:便利构造器必须最终以调用一个指定构造器结束。 一个更方便记忆的方法是: 1、指定构造器必须总是向上代理 2、便利构造器必须总是横向代理 */ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |