Swift进阶之路(一)——单例模式、属性传值、代理传值、闭包传值
一、单例模式

单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象。
关于单例,有三个重要的准则需要牢记:
1. 单例必须是唯一的(要不怎么叫单例?) 在程序生命周期中只能存在一个这样的实例。单例的存在使我们可以全局访问状态。例如:NSNotificationCenter, UIApplication和NSUserDefaults。
2. 为保证单例的唯一性,单例类的初始化方法必须是私有的。这样就可以避免其他对象通过单例类创建额外的实例。
3. 考虑到规则1,为保证在整个程序的生命周期中值有一个实例被创建,单例必须是线程安全的。并发有时候确实挺复杂,简单说来,如果单例的代码不正确,如果有两个线程同时实例化一个单例对象,就可能会创建出两个单例对象。也就是说,必须保证单例的线程安全性,才可以保证其唯一性。
实例:创建单例的两种方式
import UIKit
//final修饰符:可以防止类被继承,还可以防止子类重写父类的属性、方法以及下标。该修饰符不能修饰结构体和枚举。
final class SingleClass: NSObject
{
//使用static修饰符,定义一个静态常量。静态常量在实例调用结束后不会消失,并且保留原值,即其内存不会被释放。当下次调用实例时,仍然使用常量原有的值。
static let shared = SingleClass()
//为了保持一个单例的唯一性,单例的构造器必须是private的。以防止其他对象也能创建出单例类的实例
private override init() {}
func say()
{
print("Hello, CoolKeTang!")
}
}
SingleClass.shared.say() //第二种
final class SecondSingletonClass: NSObject
{
//使用static修饰符,定义一个静态变量。
static var shared: SecondSingletonClass
{
//借助结构体来存储类型变量(class var),并使用let修饰符来保证线程的安全
struct Static
{
static let instance: SecondSingletonClass = SecondSingletonClass()
}
return Static.instance
}
//为了保持一个单例的唯一性,单例的构造器必须是私有的,以防止其它对象也能创建出单例类的实例
private override init() {}
func say()
{
print("Hello, CoolKeTang!")
}
}
二、Swift的三种传值方式
第一种:属性传值
属性传值很简单,适用于 从第一级传入第二级(正向传递)
//在要进入的控制器定义属性
class SecViewController: UIViewController {
var labT = ""
} //在一级控制器中给二级控制器赋值
let secVC = SecViewController()
secVC.labT = "属性传值"
第二种:代理传值
(适用于逆向传值)二级到一级
//在二级控制器定义代理协议
protocol SecViewControllerDelegate{ func SecDelegateSendValue(str:String)
} class SecViewController: UIViewController {
var labT = ""
// 设置代理属性
var delegetes:SecViewControllerDelegate! = nil
//调用代理方法
if (self.delegetes != nil) {
self.delegetes.SecDelegateSendValue(str: "代理传值")
}
//在一级控制器遵循协议
class ViewController: UIViewController,SecViewControllerDelegate
//实现协议方法
func SecDelegateSendValue(str:String)
{
prolab.text = str
}
//成为代理者
secVC.delegetes = self
第三种:闭包传值
(本质是OC中的代码块传值)
// 定义闭包
typealias callBackFunc = (_ text:String) ->Void
//创建闭包对象
var selCallBack:callBackFunc?
//调用闭包
if (selCallBack != nil) {
selCallBack!("代码块传值")
}
//在一级界面 获取闭包传的值
let secVC = SecViewController()
secVC.labT = "属性传值" secVC.selCallBack = {(str:String) in self.Blocklab.text = str
}
Swift进阶之路(一)——单例模式、属性传值、代理传值、闭包传值的更多相关文章
- 浅谈Android进阶之路
过去十年是移动互联网蓬勃发展的黄金期,相信每个人也都享受到了移动互联网红利,在此期间,移动互联网经历了曙光期.成长期.成熟期.现在来说已经进入饱和期.依然记得在 2010-2013 年期间,从事移动开 ...
- Scala进阶之路-统计商家id的标签数以及TopN示例案例分析
Scala进阶之路-统计商家id的标签数以及TopN示例案例分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.项目需求 将“temptags.txt”中的数据进行分析,统计出 ...
- GO语言的进阶之路-面向对象编程
GO语言的进阶之路-面向对象编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当你看完这篇文章之时,我可以说你的Golang算是入门了,何为入门?就是你去看Docker 源码能看 ...
- GO语言的进阶之路-Golang高级数据结构定义
GO语言的进阶之路-Golang高级数据结构定义 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过Golang的基本数据类型,字符串和byte,以及rune也有所了解, ...
- Scala进阶之路-面向对象编程之类的成员详解
Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...
- PHP进阶之路 -- 02 面向对象
PHP进阶之路-- 之 “面向对象” 基础 概念 类的介绍和定义 类的属性 类常量 类的自动加载 构造函数和析构函数 访问控制 对象继承 范围解析操作符 static静态关键字 抽象类 对象接口 Tr ...
- 进阶之路 | 奇妙的Window之旅
前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习清单: Window&WindowManagerService Window&Window ...
- JavaScript进阶之路(一)初学者的开始
一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...
- MVC进阶之路:依赖注入(Di)和Ninject
MVC进阶之路:依赖注入(Di)和Ninject 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类, ...
随机推荐
- Python--进阶处理1
# ===============Python 进阶======================= # ---------第一章:数据结构和算法----------- # ----------解压序列 ...
- CH5202 自然数拆分Lunatic版【完全背包】
5202 自然数拆分Lunatic版 0x50「动态规划」例题 描述 给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复.求拆分的方案数 mod 2147483648的结 ...
- Morphia - mongodb之ORM框架
一.简介 二.注解 1.@Entity 2.@Id3.@Indexed4.@Embedded5.@Transient和@Property6.@Reference 三.示例 四.参考资料 Morphia ...
- 入木三分学网络第一篇--VRRP协议详解第一篇(转)
因为keepalived使用了VRRP协议,所有有必要熟悉一下. 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是解决局域网中配置静态网关时,静 ...
- 软中断和tasklet介绍
今天看了下tasklet,重点分析了其和软中断的关系,特此记录 关于软中断,在之前的中断文章中已经有所介绍,这里就不多说了,只是说明下,系统中默认支持32种软中断,而实际上系统定义的软中断仅有以下几种 ...
- var 声明变量的变量提升问题(let/const)
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.既全局变量. <scrip ...
- python爬虫防止IP被封的一些措施
在编写爬虫爬取数据的时候,因为很多网站都有反爬虫措施,所以很容易被封IP,就不能继续爬了.在爬取大数据量的数据时更是瑟瑟发抖,时刻担心着下一秒IP可能就被封了. 本文就如何解决这个问题总结出一些应对措 ...
- sql 区分大小写
sql server默认是不区分大小写的. 要查看sqlserver数据库是否区分大小写,我么可以查看系统存储过程sys.sp_server_info exec sys.sp_server_info ...
- CentOS7.2.1511安装docker
一.使用之前的安装方法不好使,删除的安装包第一次安装的时候直接使用epel中的源,安装完成后服务无法启动然后删除重新安装,参考文档:https://www.cnblogs.com/yufeng218/ ...
- Java中二叉树存储结构实现
一.二叉树 二叉树指的是每个节点最多只能有两个子树的有序树.通常左边的子树被称为“左子树”(left subtree),右边的子树被称为右子树. 二叉树的每个节点最多只有2棵子树,二叉树的子树次序不能 ...