微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)


/*继承

1swift的继承仍然是单继承

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、便利构造器必须总是横向代理


*/

原文地址:https://www.jb51.cc/swift/321699.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐