Swift单例模式

Swift单例模式

单例模式

单例模式的作用是解决“应用中只有一个实例”的一类问题。在Cocoa Touch框架中,有UIApplication、NSUserDefaults和NSNotificationCenter等单例类。另外,NSFileManager和NSBundle类虽然属于Cocoa框架的内容,但也可以在Cocoa Touch框架中使用(Cocoa框架中的单例类有NSFileManager、NSWorkspace和NSApplication等)。

很多人都熟悉OC的单例创建的方式,使用NSLock、@synchronized等锁,所用GCD的dispatch-once创建等..
但是Swift作为一个新的语言,跟OC的区别还是蛮大的,
那么怎么私用Swift创建一个单例呢?

单例模式的实现有很多方案,苹果公司在《UsingSwift with Cocoa and Objective-C》官方文档中给出了一种单例模式的实现。最简单形式代码如下:

    class Singleton {  
        static let sharedInstance = Singleton()  
    }  

是的就是这么简单,上述代码采用static的类属性实现单例模式,这种类属性只被延迟加载执行一次,即便是在多线程情况下也只是执行一次,并且保证是线程安全的。
当然这里使用了全局变量而非类变量,是因为不支持类变量

与类不同,结构可以定义静态变量,通过使用此方法,将静态变量升级为类变量(在支持类变量之前,推荐此方法)

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

如果我们想要有更多的初始化,我么也可以使用闭包的形式创建

    class Singleton {  
        static let sharedInstance: Singleton = {  
              let instance = Singleton()  
              // 初始化处理  
              return instance  
            }()  
    }  

当然很多人会想到dispatch-once,因为OC这样的创建方式已经习惯了,

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

但是Swift3.0取消了once的实现,
所以我们只能自己来实现.

extension DispatchQueue {
    private static var _onceTracker = [String]()
    public class func once(_ token: String, block:()->Void) {
        objc_sync_enter(self)
        defer { objc_sync_exit(self) }
        
        if _onceTracker.contains(token) {
            return
        }
        _onceTracker.append(token)
        block()
    }
}

那么我们创建的方式一样可以使用once

class Singleton {
        class var sharedInstance : Singleton {
            struct Static {
                static var onceToken = NSUUID().uuidString//可以自定一个值......
                static var instance : Singleton? = nil
            }
            DispatchQueue.once(Static.onceToken) {
                Static.instance = Singleton()
            }
            return Static.instance!
        }
    }

当然单例模式的创建,我只是列举了几个例子,至于在应用中如何使用,使用哪一个,可以根据需求来定....

你可能感兴趣的:(Swift单例模式)