每天学一点Swift----面向对象上(六)
来源:互联网 发布:js设置边框颜色 编辑:程序博客网 时间:2024/06/05 02:28
九.观察者属性
1. 为了让程序能在属性被赋值时获得执行代码的机会,Swift提供了属性观察者机制,*******属性观察者其实就是两个特殊的回调方法:
willSet(newValue)----被观察的属性即将被赋值之前自动调用该方法。
didSet(oldValue)----被观察的属性被赋值完成之后自动调用该方法。
2. 只要程序对非延迟存储的存储属性赋值----即使所赋的值与原有的值相等,属性观察者也能监听到。
3. 属性观察者可以监听如下属性的改变:
(1)除了延迟存储属性之外的所有存储属性(包括实例存储属性和类型存储属性)
(2)可通过重载方式为继承得到的属性(包括存储属性和计算属性)添加属性观察者
4. 不要为没有重载的、普通的计算属性添加属性观察者----因为没有意义。当程序对计算属性赋值时,计算属性的setter方法已经得到了执行,程序在setter方法中想做什么都可以。
5. 定义属性观察者的语法:
[修饰符]var存储属性名:属性类型 [=初始值]{
willSet(newValue){
//属性即将被赋值之前自动执行的代码
}
didSet(oldValue){
//属性被赋值之后自动执行的代码
}
}
6. 定义属性观察者的代码就是在存储属性的后面添加一对花括号,在花括号中包好willSet和didSet两个部分。----这两部分都可以省略形参,Swift将会为它们各自提供一个隐式的形参
7. 举个栗子:
class Person
{
//定义存储属性
var name : String = ""{
willSet{
//执行合理性校验,要求用户名必须在6--20位之间
if(countElements(newValue) < 6) || (countElements(newValue) > 20)
{
print("输入的人名不合格")
}
else
{
print("人名设置符合要求")
}
}
didSet{
print("人名设置完成,被修改的原名为:\(oldValue)")
}
var age : Int = 0{
willSet{
if newValue > 100 || newValue < 0
{
print("设置的年龄不合格")
}
else
{
print("年龄设置符合要求")
}
}
didSet{
print("年龄设置完成,被修改的年龄为:\(oldValue)")
}
}
}
上面的程序中分别为name、age设置了属性观察者,当程序改变name属性,或者age属性时,属性观察者就会发挥作用。
上一篇:每天学一点Swift----面向对象上(五)
下一篇:每天学一点Swift----面向对象上(七)
- 每天学一点Swift----面向对象上(六)
- 每天学一点Swift----面向对象下(六)
- 每天学一点Swift----面向对象上(一)
- 每天学一点Swift----面向对象上(二)
- 每天学一点Swift----面向对象上(三)
- 每天学一点Swift----面向对象上(四)
- 每天学一点Swift----面向对象上(五)
- 每天学一点Swift----面向对象上(七)
- 每天学一点Swift----面向对象上(八)
- 每天学一点Swift----面向对象上(九)
- 每天学一点Swift----面向对象上(十)
- 每天学一点Swift----面向对象上(十一)
- 每天学一点Swift----面向对象上(十二)
- 每天学一点Swift----面向对象下(一)
- 每天学一点Swift----面向对象下(二)
- 每天学一点Swift----面向对象下(三)
- 每天学一点Swift----面向对象下(四)
- 每天学一点Swift----面向对象下(五)
- Deep Learning(深度学习)学习笔记整理系列之(三)
- c++指针初探
- rtmp协议各字段的理解
- Deep Learning(深度学习)学习笔记整理系列之(四)
- 彻底搞明白find命令的-mtime参数的含义
- 每天学一点Swift----面向对象上(六)
- spring自定义标签使用
- jzoj P1517 背包问题
- css字体和段落、背景
- Deep Learning(深度学习)学习笔记整理系列之(五)
- CSS背景
- springboot+dubbo+mybatis集成
- 计算机图形学-基于OpenGL的直线段的裁剪算法
- Deep Learning(深度学习)学习笔记整理系列之(六)