GitHub Demo: https://github.com/BaHui/BHSwifter
简介
在Swift语言中用了
willSet
和didSet
这两个特性来监视属性除初始化
之外的变化
- willSet: 属性改变之前触发, 拥有
newValue
默认参数- didSet: 属性改变之后触发, 拥有
oldvalue
默认参数
使用方法:
// MARK: - 定义一个Person类
class BHPerson: NSObject {
var name: String? {
willSet {
print("willSet: 新值 -> \(String(describing: newValue))")
}
didSet {
print("didSet: 原值 -> \(String(describing: oldValue))")
}
}
}
// MARK: - 创建Person实例, 并修改name值
func test1() {
let person = BHPerson()
person.name = "小张"
/* 输出
* willSet: 新值 -> Optional("小张")
* didSet: 原值 -> nil
*/
person.name = "小王"
/* 输出
* willSet: 新值 -> Optional("小王")
* didSet: 原值 -> Optional("小张")
*/
}
注意点
① 属性初始化时,willSet和didSet都不会调用,只有在属性被赋值时才会调用;
② 当设置的值和原来的值一样时,willSet和didSet也会被调用;
验证①:
// MARK: - 仅初始化实例
func test2() {
let _ = BHPerson()
}
// 无输出结果
结论: 仅初始化不会触发属性观察者.
验证②:
// MARK: - 为实例赋值相同name值
func test3() {
let person = BHPerson()
person.name = nil
}
/* 输出
* willSet: 新值 -> nil
* didSet: 原值 -> nil
*/
结论: 当设置的值和原来的值一样时,willSet和didSet也会被调用;