iOS8 + Swift:创建一个真正的单例类

时间:2014-11-12 16:45:57

标签: ios swift

我正在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中有没有办法创建一个真正的单例类,在整个系统范围内只有一个实例?

3 个答案:

答案 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
  }
}

此处有更多信息。 https://github.com/hpique/SwiftSingleton