Swift—属性观察者-备

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

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

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

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

 

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

 

 

 

 

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

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

示例代码如下:

 

 
  1. class Employee {   
  2.   
  3.     var no: Int = 0  
  4.   
  5.     var name: String = "Tony" {     
  6.   
  7.     willSet(newNameValue) {   //定义name属性的willSet观察者,newNameValue是由我们分配的传递新值的参数名  
  8.   
  9.         print("员工name新值:\(newNameValue)")     
  10.   
  11.     }  
  12.   
  13.     didSet(oldNameValue) {    //定义name属性的didSet观察者,oldNameValue是由我们分配的传递旧值的参数名  
  14.   
  15.         print("员工name旧值:\(oldNameValue)")   
  16.   
  17.     }  
  18.   
  19.     }  
  20.   
  21.     var job: String?  
  22.   
  23.     var salary: Double = 0  
  24.   
  25.     var dept: Department?  
  26.   
  27. }   
  28.   
  29. struct Department {        
  30.   
  31.     var no: Int = 10 {          
  32.   
  33.     willSet {             //定义no属性的willSet观察者,注意这里没有声明参数,但是我们可以在观察者内部使用newValue  
  34.   
  35.         print("部门编号新值:\(newValue)")   
  36.   
  37.     }  
  38.   
  39.     didSet {          //定义no属性的didSet观察者,注意这里也没有声明参数,但是我们可以在观察者内部使用oldValue  
  40.   
  41.         print("部门编号旧值:\(oldValue)")    ⑫  
  42.   
  43.     }  
  44.   
  45.     }  
  46.   
  47.     var name: String = "RESEARCH"  
  48.   
  49. }   
  50.   
  51. var emp = Employee()  
  52.   
  53. emp.no = 100  
  54.   
  55. emp.name = "Smith"               ⑬  
  56.   
  57.    
  58.   
  59. var dept = Department()  
  60.   
  61. dept.no = 30                     ⑭  

 

 

 

上述代码运行结果如下:

 

 
    1. 员工name新值:Smith  
    2.   
    3. 员工name旧值:Tony  
    4.   
    5. 部门编号新值:30  
    6.   
    7. 部门编号旧值:10 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值