在Objective-C中经常会用到单例模式。最常见的就是:

[UIApplication sharedApplication].delegate

这里的sharedApplication就是一个返回单例的方法。所谓的单例模式也就是在整个APP、或者软件中只有这个类的这么一个对象。可以保存一些全局的设置等数据,达到单例对象变了整个app的全部设置都更新的效果。

忽略OC的代码,直接进入Swift代码。

第一种单例模式的实现:

class Singleton1{
class var sharedInstance: Singleton1 {
return _SharedInstance
}
}
private let _SharedInstance = Singleton1() var s1 = Singleton1()

这是第一种,最简单的单例模式的实现。在需要单例实现的类外面声明一个全局的私有常量,private let _SharedInstance = Singleton1()。之后,在单例类的computed property中声明一个类属性,并在其中返回这个类外面的单例类的实例。非常简单,但是有效的方法!

第二种单例的实现:

class Singleton2{
class var sharedInstance: Singleton2{
struct Instance{
static let instance: Singleton2 = Singleton2()
}
return Instance.instance
}
} var s2 = Singleton2()

这个实现用到的是内嵌类型。在computd property中定义了一个结构体。并在整个结构体中声明了一个静态的(class里面用的就是class关键字来声明静态的方法或者属性的)常量属性初始化了一个单例的实例。并在单例类的computed property中返回结构体总的实例。

第三种单例:

class Singleton3{
class var sharedInstance: Singleton3{
struct Instance {
static var onceToken: dispatch_once_t =
static var instance: Singleton3? = nil
}
dispatch_once(&Instance.onceToken){
Instance.instance = Singleton3()
}
return Instance.instance!
}
} var s3 = Singleton3()

这个实现用到的是类似于OC中GCD的东西。这个单例是线程安全的。其实现方式类似于第二种单例,只是加了线程锁,保证了多线程情况下可以安全的调用。

实现单例模式的关键就是在于单例的类的构造函数不能被随意的访问。咱们的这些实现方式其实都可以任意的初始化实例。其能达到的效果是在按照约定的调用方式可以达到单例的效果。在以上的实现中。第一种定义了一个私有的常量实例,在约定的调用方法之外,其他的类是访问不到这个私有常量的。第二种和第三种比较类似,都是在computed property中定义了一个嵌套类型。这样,在其他的类对象中无法访问到这个computed property中的内嵌类型。第二、三种点不同之处就在于,第二种是直接在结构体里就初始化了单例的实例,而第三种是在computed property里实现了线程安全的机制。

从Objective-C到Swift 单例模式的更多相关文章

  1. Swift - 单例模式的实现

    过去Swift要实现单例,无非是这三种方式:全局变量,内部变量和dispatch_once方式.但都略显繁琐. 后来从1.2版本起,Swift中添加了如 static let 和 static var ...

  2. swift 单例模式

    class ca{ ; static var instance:ca = ca(); class func GetInstance()->ca{ return instance; } } var ...

  3. 【转载】谷歌酝酿将苹果Swift作为安卓APP主要开发语言

    TNW中文站 4月8日报道 安卓操作系统的软件开发语言是Java,而在过去几年中,有关Java的版权,谷歌(微博)和甲骨文之间发生了长期的诉讼.最新外媒消息称,谷歌正在考虑将苹果开发的Swift作为未 ...

  4. Object-C与Swift混合开发

    Object-C作为Apple的iOS App开发语言服务了很多个年头,2014年Apple推出了新的编程语言Swift.更高效更安全的口号再次吸引了一大批非iOS开发程序猿进入,小编觉得Swift代 ...

  5. Swift新手教程系列5-函数+selector在swift中的使用方法

    原创blog.转载请注明出处 近期在用swift写代码,尽管遇到一些问题,可是代码量确实减了不少. swfit新手教程系列会随着我使用swfit中的积累,不断地去修正更新 之前的教程 swift单例模 ...

  6. 2016年iOS技术圈回顾

    2016年同2015年一样,在我还没有做好心理准备的时候,一晃神就到了年底.年关将近,不知诸君心情如何,年初的规划实现了多少,来年的计划又是否已有了眉目.年过三十的Peak君感觉年关是越来越难过了,越 ...

  7. fir.im Weekly - 这是一份强大的 SwiftGuide

    大新闻!Apple 10 亿美元融资滴滴!库克大叔对中国 iOS 开发者表达了高度认可,同时也传出 iOS 10 将内置滴滴 App 的消息.想像下,某个加班的深夜飙完代码,最性感的事情莫过于:「Si ...

  8. 设置app的状态栏样式

    http://www.jianshu.com/p/9f7f3fa624e7 http://cocoa.venj.me/blog/view-controller-based-status-bar-sty ...

  9. 转: app端数据库(性能高) realm (ios, android 均支持)

    转:  http://ios.jobbole.com/85041/ 移动端数据库新王者:realm 2016/05/14 · iOS开发 · 数据库 分享到:0 原文出处: 没故事的卓同学(@没故事的 ...

随机推荐

  1. springboot 有关拦截器遇到的问题

    最近改造搜索服务,原来是用 ngx + lua 写的,虽然性能很高,带来的问题是可维护性不太方便,不是指lua语言方面,是因为团队就2个开发人员,另外一个开发人员的擅长语言是Java,于是准备将搜索服 ...

  2. [转]iis 重新安装后 重新注册asp.net

    iis 重新安装后 重新注册asp.net 服务器IIS问题: 卸载并重新安装了IIS.... 解决方法:原因是IIS重装后要重新安装一下.NET Framework. 开始-->运行--> ...

  3. Oracle11g 搭建单实例DataGuard (转载)

    原文:http://blog.itpub.net/29324876/viewspace-1246133/ 环境:主备库都为单实例并且数据库SID相同 OS:red hat 6.5 Oracle:11. ...

  4. 31_java之项目中的数据库操作

    01项目训练目标 * A: 项目训练目标 * a: 项目目标 * 综合运用前面所学习的知识点 * 熟练View层.Service层.Dao层之间的方法相互调用操作. * 熟练dbutils操作数据库表 ...

  5. Elastic Search的学习

    那些必须要知道的事儿 自然语言处理 自然语言处理之中文分词器 什么是Apache Lucene 什么是elasticsearch 搭建elasticsearch环境 Windows下 Java环境配置 ...

  6. signal模块简介

    signal模块简介 最近在看Linux signal 相关内容,signal可以被用来进程间通信和异步处理.Python标准库提供了signal包可以用来处理信号相关.这里讨论的是Unix系统中Py ...

  7. asp.net要验证的用户名和密码

    FormsAuthentication.Authenticate()方法要验证的用户名和密码必须存储在Web.config文件内.如果要验证存储在“ASP.NET成员资格数据库”中的密码,则需要调用M ...

  8. STL string 常用函数(转)

    string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造 ...

  9. js中获取页面元素节点的几种方式

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. NBU 还原主/others服务器的SQLSERVER

    一.将数据库还原回主服务器 1.运行NetBackup MS SQL Client(10.10.0.14 administrator)2.设置连接属性 testsa 添加验证凭据 3.选择恢复,再选择 ...