Swift单例
Objective-C中单例的写法是这样的
@impletation MyManager
+ (id)sharedManager {
static MyManager *shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[MyManager alloc]init];
});
return shared;
}
仿照Objective-C中的写法,写出Swift版本
class MyManager {
class var sharedManager: MyManager {
struct Static {
static var onceToken: dispatch_once_t = 0
static var staticInstance: MyManager? = nil
}
dispatch_once(&onceToken) {
Static.StaticInstance = MyMnager()
}
return Static.StaticInstance!
}
}
Swift现在还不支持存储的class var,所以需要一个struct来存储类型变量
Swift中其实还有一个更简单的保证线程安全的方式,就是使用let。变成:
class MyManager {
class var Manager: MyManager {
struct Static {
static let sharedInstance: MyManager = MyManager()
}
return Static.SharedInstance
}
}
还有另一种更受大家欢迎,并被认为是当前的最佳实践的做法。由于现在 class 不支持 存储式的 property,我们想要使用一个只存在一份的属性时,就只能将其定义在全局的 scope 中。值得庆幸的是,在 Swift 拥有访问级别控制后,我们可以在变量定义前面加上 private 关键字,使这个变量只在当前文件中可以被访问。这样我们就可以写出一个没 有嵌套的,语法上也更简单好看的单例了:
private let sharedInstance = MyManager()
class MyManager {
class var sharedManager: MyManager {
return sharedInstance
}
}
Swift 1.2以后也可以写成这样
class MyManager {
private static let sharedInstance = MyManager()
class var sharedManager: MyManager {
return sharedInstance
}
}