Swift—属性观察者-备

为了监听属性的变化,Swift提供了属性观察者。属性观察者能够监听存储属性的变化,即便变化前后的值相同,它们也能监听到。

属性观察者主要有以下两个:

  • willSet:观察者在修改之前调用。
  • didSet:观察者在修改之后立刻调用。

属性观察者的语法格式如下:

  1. 面向对象类型 类型名 {
  2. ...
  3. var 存储属性: 属性数据类型 = 初始化值 {
  4. willSet(新值) {            //定义willSet观察者。“新值”是传递给willSet观察者的参数,它保存了将要替换原来属性的新值
  5. ...
  6. }
  7. didSet(旧值) {     //定义didSet观察者。“旧值”是传递给didSet观察者的参数,它保存了被新属性替换的旧值。
  8. ...
  9. }
  10. }
  11. }

属性观察者的语法格式比计算属性要混乱。

属性观察者可以在类和结构体中使用,不能在枚举中使用。

示例代码如下:

  1. class Employee {
  2. var no: Int = 0
  3. var name: String = "Tony" {
  4. willSet(newNameValue) {   //定义name属性的willSet观察者,newNameValue是由我们分配的传递新值的参数名
  5. print("员工name新值:\(newNameValue)")
  6. }
  7. didSet(oldNameValue) {    //定义name属性的didSet观察者,oldNameValue是由我们分配的传递旧值的参数名
  8. print("员工name旧值:\(oldNameValue)")
  9. }
  10. }
  11. var job: String?
  12. var salary: Double = 0
  13. var dept: Department?
  14. }
  15. struct Department {
  16. var no: Int = 10 {
  17. willSet {             //定义no属性的willSet观察者,注意这里没有声明参数,但是我们可以在观察者内部使用newValue
  18. print("部门编号新值:\(newValue)")
  19. }
  20. didSet {          //定义no属性的didSet观察者,注意这里也没有声明参数,但是我们可以在观察者内部使用oldValue
  21. print("部门编号旧值:\(oldValue)")    ⑫
  22. }
  23. }
  24. var name: String = "RESEARCH"
  25. }
  26. var emp = Employee()
  27. emp.no = 100
  28. emp.name = "Smith"               ⑬
  29. var dept = Department()
  30. dept.no = 30                     ⑭

上述代码运行结果如下:

    1. 员工name新值:Smith
    2. 员工name旧值:Tony
    3. 部门编号新值:30
    4. 部门编号旧值:10
上一篇:android网页分享到朋友圈问题求助?


下一篇:Java 一维数组 二维数组 三维数组