單例是?個在 Cocoa 中很常?的模式了蛮寂。對于?些希望能在全局?便訪問的實例,或者在 app 的?命周期中只應(yīng)該存在?個的對象纯路,我們?般都會使?單例來存儲和訪問宛瞄。在 Objective-C 中單例的公認的寫法類似下?這樣:
@implementation Singleton
+ (id)shared {
static Singleton *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
@end
在 Swift ?我們其實有?個更簡單的保證線程安全的?式,那就是 let 代碼如下:
class Singleton {
class var shared: Singleton {
struct Static {
static let instance: Singleton = Singleton()
}
return Static.instance
}
}
還有另?種更受?家歡迎爱咬,并被認為是 Swift 1.2 之前的最佳實踐的做法尺借。由于 Swift 1.2 之前class 不?持存儲式的 property ,我們想要使??個只存在?份的屬性時精拟,就只能將其定義在全局的 scope 中燎斩。值得慶幸的是,在 Swift 中是有訪問級別的控制的蜂绎,我們可以在變量定義前?加上 private 關(guān)鍵字栅表,使這個變量只在當(dāng)前?件中可以被訪問。這樣我們就可以寫出?個沒有嵌套的师枣,語法上也更簡單好看的單例了:
import Foundation
private let instance = Singleton()
class Singleton {
class var shared: Singleton {
return instance
}
}
在 Swift 1.2 以及之后怪瓶,如果沒有特別的需求,我們推薦使?下?這樣的?式來寫?個單例:
import Foundation
class Singleton {
private static let instance = Singleton()
class var shared: Singleton {
return instance
}
}