我正在Swift中创建一个单例类,如下所示:
class SingletonClass {
class var sharedInstance: SingletonClass {
struct Singleton {
static let instance = SingletonClass()
}
return Singleton.instance
}
var a: Int?
var b: Int?
var c: Int?
}
这允许我从任何地方访问共享实例:
SingletonClass.sharedInstance
虽然这有效,但它并不能使这个实例成为整个系统中唯一可能的实例,这就是单身人士的全部内容。
这意味着我仍然可以创建一个全新的实例,例如:
let DifferentInstance: SingletonClass = SingletonClass()
共享实例不再是唯一的了。
所以我的问题是:在Swift中有没有办法创建一个真正的单例类,在整个系统范围内只有一个实例?
答案 0 :(得分:14)
只需将初始化程序声明为私有:
private init() {}
现在只能在同一个文件中创建新实例。
答案 1 :(得分:2)
你误解了单身人士的本性。单身人士的目的是提供一个单身人士,而不是为了防止邪恶。我可以创建另一个UIApplication而不是sharedApplication
,但这将是愚蠢的,因为它不是sharedApplication
。我可以创建另一个NSNotificationCenter而不是defaultCenter
,但这将是愚蠢的,因为它不是defaultCenter
。关键不是要阻止我愚蠢,而是要提供工厂单身,这就是你已经在做的事情。别担心,快乐。
答案 2 :(得分:0)
全局变量,嵌套结构,dispatch_once。选择一个。
全局变量的惰性初始值设定项(也适用于静态成员) 第一次访问全局时运行结构和枚举) 作为dispatch_once启动,以确保初始化 原子。这使您可以在代码中使用dispatch_once: 只需使用初始化程序声明一个全局变量并标记它 私有的。
private let _singletonInstance = SingletonClass()
class SingletonClass {
class var sharedInstance: SingletonClass {
return _singletonInstance
}
}