從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裡實現了線程安全的機制。