基于Swift的iOS应用程序开发:“属性观察器”简介
来源:互联网 发布:手机mac修改器怎么用 编辑:程序博客网 时间:2024/05/17 07:09
Swift语言中的属性观察器(英文原称:Property Observer)是一个十分便利的工具,它是变量的一种延伸特性,我们可以将它的概念比做Java中的“观察者模式”,这两者的目的都是一致的:即一单监听/观察到某个对象发生了变化,就触发一系列动作。
但是Swift中的属性观察器又比Java的观察者模式更简单易懂,实现起来也更加方便-----甚至是没有任何Swift开发经验的人,或者对类似于Java 的观察者模式毫无概念的人,都能立刻理解它。
Swift的属性观察器包含两种:
第一种:willSet
第二种:didSet
故名思意,这两个观察器分别会在变量的值即将被改变之前,以及变量的值被改变之后,立即被调用
1、如何定义属性观察器
定义属性观察器是一件非常简单的事情。通常我们会怎么来定义一个变量呢?可能会是下面这样:
var changeMe:Int = 0我们定义了一个Int型的变量,叫做“changeMe”,并且为它赋初始值为0
想要定义属性观察器,只需要在变量赋值代码后面,直接写一对”{}“即可:
var changeMe:Int = 0{ willSet{ //... } didSet{ //... }}这样以来,我们就为变量“changeMe”添加了一对属性监听器
2、如何使用属性观察器
首先来看一下以下的一段关于willSet的代码:
var changeMe: Int = 0 { willSet { print("changeMe 的值是 \(changeMe),即将被改变成 \(newValue)") }}
可以看到,在willSet的内部,用到了一个叫做“newValue”的变量,但是我并没有在任何地方定义过它
实际上,“newValue”是willSet的一个默认参数。
我们也可以为willSet设置一个自定义的参数:
var changeMe: Int = 0 { willSet(newInt) { print("changeMe 的值是 \(changeMe),即将被改变成 \(newInt)") }}
在上面的代码中,关键词willSet的后面多了一对(),在这对()内部,我定义了一个参数,叫做“newInt”,然后就可以在willSet内部使用这个参数了
用同样的方式,可以使用didSet:
var changeMe: Int = 0 { didSet { print("changeMe 的值原来是 \(oldValue),现在是 \(changeMe)") }}
didSet同样有一个默认参数,叫做“oldValue”,它记录了变量被改变之前的原值。
我们同样可以为didSet设置一个自定义的参数:
var changeMe: Int = 0 { didSet(oldInt) { print("changeMe 的值原来是 \(oldInt),现在是 \(changeMe)") }}当然了,willSet和didSet是可以同时出现的:
var changeMe: Int = 0 { willSet { print("changeMe 的值是 \(changeMe),即将被改变成 \(newValue)") } didSet{ print("changeMe 的值原来是 \(oldValue),现在是 \(changeMe)") }}
我做了一个简单的示例,它是这样的:
我把这个示例的整段代码粘贴在这里:
//// 这个类演示了属性监听器的使用方式//// DemoPropertyObserverViewController.swift// MyDemo//// Created by freezingxu on 2017/7/17.// Copyright © 2017年 freezingxu. All rights reserved.//import UIKitclass DemoPropertyObserverViewController: UIViewController { // MARK: 属性 /** * 用来测试属性观察器的变量 */ var changeMe:Int = 0 { willSet{ self.textFieldBeforeSet.text = "变化前:\(changeMe),即将变成:\(newValue)" } didSet{ self.textFieldAfterSet.text = "变化前:\(oldValue),变化后:\(changeMe)" } } /** * 在这个文本输入框中,将会显示变量的最终结果 */ @IBOutlet weak var textFieldFinally: UITextField! /** * 当变量的值被改变前的一瞬间,会在这个文本输入框中显示一些文字 */ @IBOutlet weak var textFieldBeforeSet: UITextField! /** * 当变量的值被改变之后,会在这个文本输入框中显示一些文字 */ @IBOutlet weak var textFieldAfterSet: UITextField! // MARK: 生命周期 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //MARK: 自定义方法 /** * 当用户按下按钮的时候,会调用到本方法 * 变量的值会发生变化,并且触发属性观察器,将观察结果显示在界面上 */ @IBAction func tryPropertyObserver(_ sender: Any) { self.changeMe += 1 self.textFieldFinally.text = "变量的最终值:\(self.changeMe)" if self.changeMe > 9 { self.changeMe = 0 self.textFieldFinally.text = "归零了!" } }}
阅读全文
0 0
- 基于Swift的iOS应用程序开发:“属性观察器”简介
- 基于Swift的iOS应用程序开发:第三方日历组件CVCalendar简介
- 9.7 Swift属性观察器
- 基于Swift的iOS应用程序开发:创建Swift与Objective-C之间的桥接头文件
- Swift 类的属性观察器 didSet willSet
- 基于Swift的iOS应用程序开发:使用xcode进行iOS应用程序开发时,各种Launch Image尺寸清单
- 基于Swift的iOS应用程序开发:获得屏幕点击的坐标
- 基于Swift的iOS应用程序开发:解析json格式的数据
- 基于Swift的iOS应用程序开发:使用NSUserDefaults存储本地数据
- 基于Swift的iOS应用程序开发:使用表格显示并控制数据(一):显示数据
- 基于Swift的iOS应用程序开发:对字符串进行MD5加密
- 基于Swift的iOS应用程序开发:通过UITextFieldDelegate快速理解Delegate事件代理
- 基于Swift的iOS应用程序开发:使用NSMutableURLRequest向服务器发送请求
- 基于Swift的iOS应用程序开发:使用URLSession向服务器发送请求
- 基于Swift的iOS应用程序开发:字符串String与Data数据类型相互转换
- 基于Swift的iOS应用程序开发:使用UIImagePickerController调取摄像头进行拍照
- 基于Swift的iOS应用程序开发:使用UIImagePickerController从相册选择图片
- 11.6 Swift重写属性观察器
- ArrayList与LinkedList的区别
- 在数组中指定位置添加和删除元素
- 2012 浙大机试 Hello World for U
- 【opencv】LBP(局部二进制模式)算法的实现
- 常量的优雅分类
- 基于Swift的iOS应用程序开发:“属性观察器”简介
- Java实践(四)---程序设计模式
- Kafka+Storm+HBase项目Demo(6)--前端HTTP长连接实现
- 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
- jquery获取当前的节点
- bzoj 3524 主席树 解题报告
- ural1297Palindrome (后缀数组+lcp)
- 【codevs 3186】队列练习2
- 术--经典题解析(2)