从Objective-C到Swift 单例模式

在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 = 0
            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里实现了线程安全的机制。

时间: 2024-10-06 08:40:49

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

Objective中调用Swift代码

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc 步骤比较简单: 1.在Objective C工程中,创建新文件(command+N),选择Swift文件 2.选择创建bridge-header,后会生成两个文件,一个是bridge-header(这个暂时没用,这个文件是用来将objective c中的接口暴露给swift),一个是swift文件 3.在swift中想要暴露给objective C中的类或者方法前加上@objc关键字(@objc关键字的一

Swift - 单例模式的实现

过去Swift要实现单例,无非是这三种方式:全局变量,内部变量和dispatch_once方式.但都略显繁琐. 后来从1.2版本起,Swift中添加了如 static let 和 static var 这样的类变量的支持,这样单例的实现又简化了许多. 下面提供两种比较好的单例写法.(要注意:不管哪种写法都要注意将init()方法私有化.因为在Swift中,所有对象的构造器默认都是 public,需要重写init让其成为私有的,防止其他对象使用这个类的默认的'()'初始化方法来创建对象.这里感谢网

Swift 单例模式实现及类方法

在开始单例模式之前我们先讲一下类方法.应为单例模式需要依靠类方法来实现 首先,我们知道类方法就是 直接使用类名来调用,无需生成对象,再去调用. 其实类方法的生成很简单,只需要给我们之前的对象方法用class关键字来修饰即可 我们来看一个示例 对象方法 func userName()->String{ return "zhangsan" } 类方法 class func userName()->String{ return "zhangsan" } 接下来

swift 单例模式

class ca{ var count = 1; static var instance:ca = ca(); class func GetInstance()->ca{ return instance; } } var a = ca.GetInstance(); var b = ca.GetInstance(); a.count = 2; println("\(a.count),\(b.count)");//2,2

iOS swift单例模式

普通的写法: class SwiftSingleton { class var shared: SwiftSingleton { if !Inner.instance { Inner.instance = SwiftSingleton() } returnInner.instance! } structInner { staticvar instance: SwiftSingleton? } } 但系统多个线程在执行,这种情况下就会创建多个实例,没有保证实例的唯一性.也可以修改成另外一种方式:

swift之单例模式

swift单例模式的几种方式: 1. 全局变量 private let _singleton = Singleton() class Singleton: NSObject { class var sharedInstance: Singleton { get { return _singleton } } } 2. 内部变量 class Singleton { class var sharedInstance: Singleton { get { struct SingletonStruct

Object-C与Swift混合开发

Object-C作为Apple的iOS App开发语言服务了许多个年头,2014年Apple推出了新的编程语言Swift,更高效更安全的口号再次吸引了一大批非iOS开发程序员进入,小编认为Swift取代Object-C只是时间问题,在神州这片土地上,毕竟技术普及有些落后,但再有两年左右时间Swift产品链将形成,第三方支持框架逐步完善,Swift必将成为iOS开发主流.目前来看,激进派的现状Swift与Object-C混合开发. Object-C中调用Swift 下面就给大家分享下Object-

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

原创blog.转载请注明出处 近期在用swift写代码,尽管遇到一些问题,可是代码量确实减了不少. swfit新手教程系列会随着我使用swfit中的积累,不断地去修正更新 之前的教程 swift单例模式具体解释-线程安全,多核性能 swift新手教程4-集合(Array,Dictionary) swift新手教程3-字符串String swift新手教程2-运算符 swift新手教程1-准备知识 在swift中,函数有keywordfunc声明 格式 func 函数名(參数1,參数2,...)-

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

TNW中文站 4月8日报道 安卓操作系统的软件开发语言是Java,而在过去几年中,有关Java的版权,谷歌(微博)和甲骨文之间发生了长期的诉讼.最新外媒消息称,谷歌正在考虑将苹果开发的Swift作为未来安卓软件开发的“一级”语言,此外Facebook.Uber等公司也开始越来越重视Swift的使用. 据美国科技新闻网站TheNextWeb引述知情人士报道,此前苹果Swift转变为开放源码语言,而谷歌.Facebook.和Uber三家公司的代表曾经在英国伦敦开会,专门讨论Swift语言,谷歌决定逐