“属性监视器”的使用方法

属性监视器

属性监视器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性监视器,甚至新的值和现在的值相同的时候也不例外。

可以为除了延迟存储属性之外的其他存储属性添加属性监视器,也可以通过重载属性的方式为继承的属性(包括存储属性和计算属性)添加属性监视器。属性重载请参考继承一章的重载。

注意:

不需要为无法重载的计算属性添加属性监视器,因为可以通过 setter 直接监控和响应值的变化。

可以为属性添加如下的一个或全部监视器:

willSet在设置新的值之前调用

didSet在新的值被设置之后立即调用

willSet监视器会将新的属性值作为固定参数传入,在willSet的实现代码中可以为这个参数指定一个名称,如果不指定则参数仍然可用,这时使用默认名称newValue表示。

类似地,didSet监视器会将旧的属性值作为参数传入,可以为该参数命名或者使用默认参数名oldValue。

注意:

willSet和didSet监视器在属性初始化过程中不会被调用,他们只会当属性的值在初始化之外的地方被设置时被调用。

这里是一个willSet和didSet的实际例子,其中定义了一个名为StepCounter的类,用来统计当人步行时的总步数,可以跟计步器或其他日常锻炼的统计装置的输入数据配合使用。

class StepCounter {
   var totalSteps: Int = 0 {
   willSet(newTotalSteps) {
       println("About to set totalSteps to \(newTotalSteps)")
    }
   didSet {
       if totalSteps > oldValue  {
           println("Added \(totalSteps - oldValue) steps")
       }
    }
    }
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps

StepCounter类定义了一个Int类型的属性totalSteps,它是一个存储属性,包含willSet和didSet监视器。

当totalSteps设置新值的时候,它的willSet和didSet监视器都会被调用,甚至当新的值和现在的值完全相同也会调用。

例子中的willSet监视器将表示新值的参数自定义为newTotalSteps,这个监视器只是简单的将新的值输出。

didSet监视器在totalSteps的值改变后被调用,它把新的值和旧的值进行对比,如果总的步数增加了,就输出一个消息表示增加了多少步。didSet没有提供自定义名称,所以默认值oldValue表示旧值的参数名。

注意:

如果在didSet监视器里为属性赋值,这个值会替换监视器之前设置的值。

时间: 2024-08-30 14:37:52

“属性监视器”的使用方法的相关文章

Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等

写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号. 一.类与结构体 两者在Swift中差不了多少了 类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的) 1)都可以定义属性/方法/下标(结构体也可以定义方法了) 2)都能初始化(通过构造方法) 3)都能使用扩展(extension)与协议(protocol) 4)类与结构体(枚举)中的全局属性/方法:在类中用class关键字,但在结构体中

Swift - 属性 - 属性监视器(didSet、willSet)

属性监视器 1.属性监视器功能 属性观察器控 制和响应属性的变化, 每次属性被设置值的时候会调用属性观察器,甚至新的值和旧的值相同的时候也不例外. 可以通过重载属性的方法为继承的谁能够(包括存储属性和计算属性)添加属性观察器 注意: 不需要为无法重载的计算属性添加属性观察器, 因为可以通过setter直接监控和响应值的变化 2.属性监视器方法 1. willSet 功能: 在设置新的值之前调用 介绍: illSet 观察器会将新的属性值作为固定参数传入,在willSet的事项代码中可以为这个参数

【iOS】Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等

写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号. 一.类与结构体 两者在Swift中差不了多少了 类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的) 1)都可以定义属性/方法/下标(结构体也可以定义方法了) 2)都能初始化(通过构造方法) 3)都能使用扩展(extension)与协议(protocol) 类比结构体多的功能: 1)能继承 2)运行时能检查类对象的类型 3)析构释放资源

Javascript的私有变量和方法、共有变量和方法以及特权方法、构造器、静态共有属性和静态共有方法

一.私有变量:定义在函数内部的属性和方法称之为该函数的私有属性和方法        共有变量:在函数内部通过this创建的对象和方法称之为该函数的共有属性和方法 特权方法:通过this创建的既可以访问该函数的共有属性和方法,也可以访问该函数的私有属性和方法称之为特权方法 构造器:对象在创建的时候调用特权方法来初始化实例的属性,这个方法也称为构造器 /** * 类的内部私有属性.私有方法.特权方法.共有属性和共有方法以及构造器 * @param id * @param bookname * @pa

Python类属性访问的魔法方法

Python类属性访问的魔法方法: 1. __getattr__(self, name)- 定义当用户试图获取一个不存在的属性时的行为 2. __getattribute__(self, name)- 定义当该类的属性被访问时的行为 注意:当__getattr__与__getattribute__同时重写时,访问属性时,优先调用__getattribute__,只有当被访问的属性不存在时才触发__getattr__ 3. __setattr__(self, name, value)- 定义当一个

combobox 属性、事件、方法

一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActionDescription 获取或设置控件的默认操作说明,供辅助功能客户端应用程序使用. AccessibleDescription 获取或设置辅助功能客户端应用程序使用的控件说明. AccessibleName 获取或设置辅助功能客户端应用程序所使用的控件名称. AccessibleRole 获取

js+jquery动态设置/增加/删除/获取元素属性的两种方法集锦对比(动态onclick属性设置+动态title设置)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html140/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>

实现Date函数属性中的format方法

js中没有Date.format方法的,所以在date属性中加format方法 //js格式化属性 Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, //month "d+": this.getDate(), //day "h+": this.getHours(), //hour "m+": this.getMinu

window属性、事件、方法一览

记录这个表格,是之前多次碰到一些不熟悉,或者从未使用过的事件来处理一些棘手问题时,总以为是新的浏览器特性,其实在一些老旧浏览器上,或者window上已经本身提供了一些事件绑定或者方法的调用. 最近正好在重写sugget/autocomplete的组件,一直以来比较棘手的问题解决是当鼠标焦点离开<input>时,而刚好在suggest的列表浮层上触发click时,处理显得比较麻烦,以前较为常规的解决方案是采用delay这种方式来延迟事件上下文的处理,往往在定义delayTime的时候比较折腾,需