《从零开始学Swift》学习笔记(Day 44)——重写属性
重写实例属性 我们可以在子类中重写从父类继承来的属性,属性有实例属性和静态属性之分,他们在具体实现也是不同的。 实例属性的重写一方面可以重写getter和setter访问器,另一方面可以重写属性观察者。 计算静态属性需要使用getter和setter访问器,而存储属性不需要。子类在继承父类后,也可以通过getter和setter访问器重写父类的存储属性和计算属性。 下面看一个示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 class Person{ varname:String //存储属性 varage:Int //存储属性 funcdescription()->String{ return "\(name)年龄是:\(age)" } init(name:String,age:Int){ self.name=name self.age=age } } class Student:Person{ varschool:String overridevarage:Int{ //重写属性前面要添加override关键字 get{ return super .age } set{ super .age=newValue< 8 ? 8 :newValue } } convenienceinit(){ self.init(name: "Tony" ,age: 18 ,school: "清华大学" ) } init(name:String,age:Int,school:String){ self.school=school super .init(name:name,age:age) } } letstudent1=Student() print( "学生年龄:\(student1.age)" ) student1.age= 6 print( "学生年龄:\(student1.age)" ) 从属性重写可见,子类本身并不存储数据,数据是存储在父类的存储属性中的。 以上示例是重写属性getter和setter访问器,我们还可以重写属性观察者,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 class Person{ varname:String varage:Int funcdescription()->String{ return "\(name)年龄是:\(age)" } init(name:String,age:Int){ self.name=name self.age=age } } class Student:Person{ varschool:String overridevarage:Int{ //重写了age属性观察者 willSet{ //如果只关注修改之前的调用,可以只重写willSet观察者 print( "学生年龄新值:\(newValue)" ) } didSet{ //如果只关注修改之后的调用,可以只重写didSet观察者 print( "学生年龄旧值:\(oldValue)" ) } } convenienceinit(){ self.init(name: "Tony" ,age: 18 ,school: "清华大学" ) } init(name:String,age:Int,school:String){ self.school=school super .init(name:name,age:age) } } letstudent1=Student() print( "学生年龄:\(student1.age)" ) Student1.age= 6 print( "学生年龄:\(student1.age)" ) 代码Student1.age = 6修改了age属性,修改前后的输出结果如下: 学生年龄新值:6 学生年龄旧值:18 重写静态属性 在类中静态属性定义使用class或static关键字,但是使用哪一个要看子类中是否重写该属性。class修饰的属性可以被重写,static关键字就不能被重写。 示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 class Account{ varamount:Double= 0.0 //账户金额 varowner:String= "" //账户名 varinterestRate:Double= 0.0668 //利率 //class不能换成static class varstaticProp:Double{ //静态属性staticProp return 0.0668 *1_000_000 } varinstanceProp:Double{ return self.interestRate*self.amount } } class TermAccount:Account{ //class换成static override class varstaticProp:Double{ //重写静态属性staticProp return 0.0700 *1_000_000 } } //访问静态属性 print(Account.staticProp) print(TermAccount.staticProp) 由于要被重写所以代码class var staticProp: Double中的class不能换成static。代码overrideclass var staticProp: Double中的静态属性staticProp可以使用class或static,除非在TermAccount的子类中重写属性staticProp。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1747501,如需转载请自行联系原作者