《从零开始学Swift》学习笔记(Day 33)——属性观察者
为了监听属性的变化,Swift提供了属性观察者。属性观察者能够监听存储属性的变化,即便变化前后的值相同,它们也能监听到。
属性观察者主要有以下两个:
-
willSet:观察者在修改之前调用。
-
didSet:观察者在修改之后立刻调用。
属性观察者的语法格式如下:
面向对象类型类型名 {
|
1
2
3
4
5
6
7
8
9
10
|
...
var 存储属性: 属性数据类型 = 初始化值 {
willSet(新值) {
//定义willSet观察者。“新值”是传递给willSet观察者的参数,它保存了将要替换原来属性的新值
...
}
didSet(旧值) {
//定义didSet观察者。“旧值”是传递给didSet观察者的参数,它保存了被新属性替换的旧值。
...
}
}
}
|
属性观察者的语法格式比计算属性要混乱。
属性观察者可以在类和结构体中使用,不能在枚举中使用。
示例代码如下:
|
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
|
class
Employee {
var no: Int =
0
var name: String =
"Tony"
{
willSet(newNameValue) {
//定义name属性的willSet观察者,newNameValue是由我们分配的传递新值的参数名
print(
"员工name新值:\(newNameValue)"
)
}
didSet(oldNameValue) {
//定义name属性的didSet观察者,oldNameValue是由我们分配的传递旧值的参数名
print(
"员工name旧值:\(oldNameValue)"
)
}
}
var job: String?
var salary: Double =
0
var dept: Department?
}
struct Department {
var no: Int =
10
{
willSet {
//定义no属性的willSet观察者,注意这里没有声明参数,但是我们可以在观察者内部使用newValue
print(
"部门编号新值:\(newValue)"
)
}
didSet {
//定义no属性的didSet观察者,注意这里也没有声明参数,但是我们可以在观察者内部使用oldValue
print(
"部门编号旧值:\(oldValue)"
)
}
}
var name: String =
"RESEARCH"
}
var emp = Employee()
emp.no =
100
emp.name =
"Smith"
var dept = Department()
dept.no =
30
|
上述代码运行结果如下:
员工name新值:Smith
员工name旧值:Tony
部门编号新值:30
部门编号旧值:10
本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1746600,如需转载请自行联系原作者