Swift单例实现与经验分享

前言

这些天在研究利用Objective-C的runtime的method swizzling,发现简直是黑魔法啊,有兴趣的同学可以看看,链接传送门:http://nshipster.com/swift-objc-runtime/

看到里面使用dispatch_once来实现的单例,保证线程安全,我在这篇文章中也分享下我对Swift单例的理解与用法吧

单例的英文: Singleton

我所了解在Swift中有三种实现单例的方法,科学的在前面 :)

1. 类常量 Class Constant

在Swift1.2,Swift2以上的童鞋们请自觉考虑这种方法
class Singleton {
    static let sharedInstance: Singleton = Singleton() 
}

这是一个会被整个当前class所分享的常量,并且不会被subclass所override,let保证了这个是线程安全滴。同时Swift在这里很机智的实现了懒加载,所以变得更加科学了。

不过注意Swift1.2以下是不支持,如果要考虑到向下兼容,请看继续看下面的方法。

2. Nested结构

class Singleton {
    class var sharedInstance {
        struct SharedStatic {
            static let instance: Singleton = Singleton()
            return SharedStatic.instance
        }
    }
}

这样写也很科学,虽然长了很多,至少是安全并且合理的。这里的class var就是静态变量,class func同理是静态函数,就像是static function一样的感觉。

3. GCD的dispatch_once

class Singleton {
    class var sharedInstance {
        struct SharedStatic {
            static var token: dispatch_once_t = 0
            static var instance: Singleton? = nil
        }
        dispatch_once(&SharedStatic.token) { SharedStatic.instance = Singleton() }
        return SharedStatic.instance!
    }
}

这是传统Objective-C处理单例的写法,熟悉GCD的童鞋应该都了解过,不知道为何在国内很多文章中这种做法是被首推的,在我查阅了许多国内外的文档之后,基本确认这种方法相对于上面两种没有任何优势,除了看起来比较牛逼。

你可能感兴趣的:(Swift单例实现与经验分享)