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
	}
}
posted @ 2016-05-10 15:50  pszertlek  阅读(314)  评论(0编辑  收藏  举报