Swift 2.0学习笔记(Day 44)——重写属性

前端之家收集整理的这篇文章主要介绍了Swift 2.0学习笔记(Day 44)——重写属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
原创文章,欢迎转载。转载请注明:关东升的博客

重写实例属性

我们可以在子类中重写从父类继承来的属性属性有实例属性和静态属性之分,他们在具体实现也是不同的。

实例属性的重写一方面可以重写gettersetter访问器,另一方面可以重写属性观察者。

计算静态属性需要使用gettersetter访问器,而存储属性不需要。子类在继承父类后,也可以通过gettersetter访问器重写父类的存储属性和计算属性

下面看一个示例:

  1. class Person {
  2.  
  3.  
  4. var name: String //存储属性
  5.  
  6. var age: Int //存储属性
  7.  
  8.  
  9. func description() -> String {
  10.  
  11. return "\(name) 年龄是: \(age)"
  12.  
  13. }
  14.  
  15.  
  16. init (name: String,age: Int) {
  17.  
  18. self.name = name
  19.  
  20. self.age = age
  21.  
  22. }
  23.  
  24. }
  25.  
  26.  
  27. class Student: Person {
  28.  
  29.  
  30. var school: String
  31.  
  32.  
  33. override var age: Int { //重写属性前面要添加override关键字
  34.  
  35. get {
  36.  
  37. return super.age
  38.  
  39. }
  40.  
  41. set {
  42.  
  43. super.age = newValue < 8 ? 8: newValue
  44.  
  45. }
  46.  
  47. }
  48.  
  49.  
  50. convenience init() {
  51.  
  52. self.init(name: "Tony",age: 18,school: "清华大学")
  53.  
  54. }
  55.  
  56.  
  57. init (name: String,age: Int,school: String) {
  58.  
  59. self.school = school
  60.  
  61. super.init(name: name,age: age)
  62.  
  63. }
  64.  
  65. }
  66.  
  67.  
  68. let student1 = Student()
  69.  
  70. print("学生年龄:\(student1.age)")
  71.  
  72. student1.age = 6
  73.  
  74. print("学生年龄:\(student1.age)")

属性重写可见,子类本身并不存储数据,数据是存储在父类的存储属性中的。

以上示例是重写属性gettersetter访问器,我们还可以重写属性观察者,代码如下:

  1. class Person {
  2.  
  3.  
  4. var name: String
  5.  
  6. var age: Int
  7.  
  8.  
  9. func description() -> String {
  10.  
  11. return "\(name) 年龄是: \(age)"
  12.  
  13. }
  14.  
  15.  
  16. init (name: String,age: Int) {
  17.  
  18. self.name = name
  19.  
  20. self.age = age
  21.  
  22. }
  23.  
  24. }
  25.  
  26.  
  27. class Student: Person {
  28.  
  29.  
  30. var school: String
  31.  
  32.  
  33. override var age: Int { //重写了age属性观察者
  34.  
  35. willSet { //如果只关注修改之前的调用,可以只重写willSet观察者
  36.  
  37. print("学生年龄新值:\(newValue)")
  38.  
  39.  
  40. }
  41.  
  42. didSet{ //如果只关注修改之后的调用,可以只重写didSet观察者
  43.  
  44. print("学生年龄旧值:\(oldValue)")
  45.  
  46. }
  47.  
  48. }
  49.  
  50.  
  51. convenience init() {
  52.  
  53. self.init(name: "Tony",age: age)
  54.  
  55. }
  56.  
  57. }
  58.  
  59.  
  60. let student1 = Student()
  61.  
  62. print("学生年龄:\(student1.age)")
  63.  
  64. Student1.age = 6
  65.  
  66. print("学生年龄:\(student1.age)")

代码Student1.age = 6修改age属性修改前后的输出结果如下:

学生年龄新值:6

学生年龄旧值:18

重写静态属性

在类中静态属性定义使用classstatic关键字,但是使用哪一个要看子类中是否重写该属性class修饰的属性可以被重写,static关键字就不能被重写。

示例代码如下:

  1. class Account {
  2.  
  3.  
  4. var amount: Double = 0.0 // 账户金额
  5.  
  6. var owner: String = "" //账户名
  7.  
  8.  
  9. var interestRate: Double = 0.0668 //利率
  10.  
  11.  
  12. //class不能换成static
  13.  
  14. class var staticProp: Double { //静态属性staticProp
  15.  
  16. return 0.0668 * 1_000_000
  17.  
  18. }
  19.  
  20.  
  21. var instanceProp: Double {
  22.  
  23. return self.interestRate * self.amount
  24.  
  25. }
  26.  
  27. }
  28.  
  29.  
  30. class TermAccount: Account {
  31.  
  32.  
  33. //class换成static
  34.  
  35. override class var staticProp: Double { //重写静态属性staticProp
  36.  
  37. return 0.0700 * 1_000_000
  38.  
  39. }
  40.  
  41. }
  42.  
  43.  
  44. //访问静态属性
  45.  
  46. print(Account.staticProp)
  47.  
  48. print(TermAccount.staticProp)

由于要被重写所以代码class var staticProp: Double 中的class不能换成static代码overrideclass var staticProp: Double中的静态属性staticProp可以使用classstatic,除非在TermAccount的子类中重写属性staticProp


欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
更多精品iOSCocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com智捷课堂论坛网站:http://51work6.com/forum.php

猜你在找的Swift相关文章