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),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类, ...
随机推荐
- Go语言 map的实现
Go中的map在底层是用哈希表实现的,你可以在 $GOROOT/src/pkg/runtime/hashmap.goc 找到它的实现. 数据结构 哈希表的数据结构中一些关键的域如下所示: struct ...
- 后台curl网络请求
<?php //前端进行网络请求 ajax //后台进行网络请求用到两种方式 curl socket //进行网络请求的步骤 //1.初始化一个curl //2.对curl进行配置 // ...
- idea破解方法
1.http://idea.lanyus.com/ 下载破解文件 2.将下载的JetbrainsIdesCrack-3.4-release-enc.jar破解文件放在idea安装目录下的bin中: 3 ...
- Python3量化技术常用插件
1. 确定自己的系统为64位版本 2. 下载安装Python3 64位版本 如果要使用zipline,建议使用python3.5.另外发现很多东西要求的也是3.5. 主页地址: https://www ...
- java基础07 循环结构
public class While02 { public static void main(String[] args) { /** * while(循环条件){ * 循环体(循环操作) * } * ...
- 使用nginx搭建文件下载服务器
搭建一个文件服务器的方式有很多,本文介绍笔者曾经用过的两种: 使用nginx 使用java服务,通过controller提供 一.使用nginx搭建 在nginx.conf中直接配置server即可, ...
- Python之配置文件读写
ConfigParser模块 一.创建配置文件 在D盘建立一个配置文件,名字为:test.ini 内容如下: [baseconf] host=127.0.0.1 port=3306 user=root ...
- 单例Singleton模式的两种实现方法
在设计模式中,有一种叫Singleton模式的,用它可以实现一次只运行一个实例.就是说在程序运行期间,某个类只能有一个实例在运行.这种模式用途比较广泛,会经常用到,下面是Singleton模式的两种实 ...
- 安装odoo过程中出现的问题
一 centos6.5 1. simplejson error:module not found fix: easy_install simplejson 2. python version erro ...
- HDU1520:Anniversary party(树形dp第一发)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1520 一个公司去参加宴会,要求去的人不能有直接领导关系,给出每一个人的欢乐值,和L K代表K是L的直接领导 ...