1.OC单例写法
我们知道在Objective-C中我们经常这样去写单例
@implementation SXDataManager
static SXDataManager *sharedInstance = nil;
+ (SXDataManager*)sharedInstance
{
static dispatch_once_t once;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
@end
2.Swift单例写法
而在Swift中我们经常这样去写单例
class SXDataManager : NSObject {
class var sharedInstance: SXDataManager {
struct Static {
static var instance: SXDataManager?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token) {
Static.instance = SXDataManager()
}
return Static.instance!
}
}
(2)关于dispatch_once_t is unavailable in Swift的解决
当你在Xcode中遇到以下问题时
我们进入到官方api,会发现以下注释
这说明我们的swift3中已经不再适用dispatch_once_t.我们可以用以下的方式创建单例来解决
class SXDataManager : NSObject {
static let sharedInstance = SXDataManager()
}
我们为什么能直接用static let
苹果其实已经在static let
修饰变量的实现中使用了dispatch_once的方式保证了变量只存在一份。这样我们写单例的方式是不是比以前更简洁了呢。