Swift编程语言学习10—— 枚举属性监视器
属性监视器
属性监视器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性监视器。甚至新的值和如今的值同样的时候也不例外。
能够为除了延迟存储属性之外的其它存储属性加入属性监视器,也能够通过重载属性的方式为继承的属性(包含存储属性和计算属性)加入属性监视器。属性重载请參考继承一章的重载。
注意:
不须要为无法重载的计算属性加入属性监视器,由于能够通过 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监视器里为属性赋值,这个值会替换监视器之前设置的值。
Swift编程语言学习10—— 枚举属性监视器的更多相关文章
- Swift编程语言学习11—— 枚举全局变量、局部变量与类型属性
全局变量和局部变量 计算属性和属性监视器所描写叙述的模式也能够用于全局变量和局部变量,全局变量是在函数.方法.闭包或不论什么类型之外定义的变量,局部变量是在函数.方法或闭包内部定义的变量. 前面章节提 ...
- Swift编程语言学习9—— 存储属性和计算属性
属性将值跟特定的类.结构或枚举关联.存储属性存储常量或变量作为实例的一部分,计算属性计算(而不是存储)一个值.计算属性能够用于类.结构体和枚举里,存储属性仅仅能用于类和结构体. 存储属性和计算属性通经 ...
- Swift编程语言学习6—— 闭包
闭包是自包括的函数代码块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其它一些编程语言中的 lambdas 函数比較类似. 闭 ...
- Swift编程语言学习4.3—— 控制语句
控制传递语句(Control Transfer Statements) 控制转移语句改变你代码的运行顺序,通过它你能够实现代码的跳转.Swift有四种控制转移语句. continue break fa ...
- Swift 编程语言学习0.1——Swift简单介绍
有的时候,认为看英文文档有些费时,看中文文档怕翻译不准,有些地方确实不须要抠字眼.当有些地方假设翻译不精准会产生歧义,所以用这样对比的方式.顺便学习一下Swift. Swift is a new pr ...
- Swift编程语言学习12 ——实例方法(Instance Methods)和类型方法(Type Methods)
方法是与某些特定类型相关联的函数.类.结构体.枚举都能够定义实例方法:实例方法为给定类型的实例封装了详细的任务与功能.类.结构体.枚举也能够定义类型方法:类型方法与类型本身相关联.类型方法与 Obje ...
- Swift编程语言学习4.1——周期
Swift它提供了类似 C 流量控制结构语言,它包含运行多个任务的能力for和while周期.选择根据不同的编码分支机构的具体条件来运行if和switch声明,有控制流程跳转到其他代码break和co ...
- Swift编程语言学习2.1——基础运营商(在)
操作员正在检查,更改.归并值特殊符号或短语.例如,加+这两个数字相加(例如let i = 1 + 2). 算如更复杂的逻辑和操作的实施&&(例如if enteredDoorCode & ...
- Swift编程语言学习3.1排列
Swift 语言提供经典的数组和字典两种集合类型来存储集合数据.数组用来按顺序存储同样类型的数据.字典尽管无序存储同样类型数据值可是须要由独有的标识符引用和寻址(就是键值对). Swift 语言里的数 ...
随机推荐
- [置顶] java Gui 键盘监听事件
简单写一个java Gui键盘监听事件,实现的效果就是按下键盘控制台输出你按下的键.比如:按下A控制台就输出A 效果如图: 以下把实现的效果分为几个步骤: 1.新建一个窗体类继承窗体: 2.给这个窗体 ...
- 采用管道处理HTTP请求
采用管道处理HTTP请求 之所以称ASP.NET Core是一个Web开发平台,源于它具有一个极具扩展性的请求处理管道,我们可以通过这个管道的定制来满足各种场景下的HTTP处理需求.ASP. NET ...
- 【ASP.NET Web API教程】2 创建各种Web API
原文 [ASP.NET Web API教程]2 创建各种Web API Chapter 2: Creating Web APIs第2章 创建各种Web API 本文引自:http://www.asp. ...
- java 控制表项删除、编辑、添加(实现接口)
package com.platformda.optimize; import java.awt.BorderLayout; import java.awt.Point; import java.aw ...
- Swift - 数字格式化转成字符串(保留两位小数)
1,下面是一个浮点类型的数字转成String字符串的例子 1 2 var f = 123.32342342 var s:String = "\(f)" //123.32342342 ...
- Qml 写的弹出层控件(13篇博客)
QML弹出窗口组件,灯箱效果.动画效果,可拖拽 核心思路:一个mask层,一个最顶层,都用rectangle,禁止事件穿透 使用 Popup { id: popup width: 200; heigh ...
- 为什么Lisp语言如此先进?(译文) - 阮一峰的网络日志
为什么Lisp语言如此先进?(译文) - 阮一峰的网络日志 为什么Lisp语言如此先进?(译文)
- JavaScript学习总结1
/***我是切割线 的開始***/ //利用prototype属性能够加入公有属性和方法 function myConstructor2(){ this.a='大灰狼'; }; //声明构造函数,能够 ...
- Delphi中类的运行期TypeInfo信息结构说明
Delphi中类的运行期TypeInfo信息结构说明 CnPack 开源软件项目 2007-09-19 21:55:58 Delphi中类的运行期TypeInfo信息结构说明作者:刘啸CnPack开发 ...
- Linux下的softlink和hardlink(转)
Linux中包括两种链接:硬链接(hard link)和软链接(soft link),软链接又称为符号链接(symbolic link) 创建命令:ln -s destfile/directory s ...