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

iOS8 + Swift: Create a true singleton class

本问题已经有最佳答案,请猛点这里访问。

我用swift创建了一个singleton类,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class SingletonClass {

    class var sharedInstance: SingletonClass {
        struct Singleton {
            static let instance = SingletonClass()
        }

        return Singleton.instance
    }


    var a: Int?
    var b: Int?
    var c: Int?
}

这允许我从任意位置访问共享实例:

1
SingletonClass.sharedInstance

虽然这是可行的,但它并不能使这个实例成为整个系统中唯一可能的实例,这就是单例技术的全部意义。
这意味着我仍然可以创建一个全新的实例,比如:

1
let DifferentInstance: SingletonClass = SingletonClass()

共享实例不再是唯一的实例了。< BR>< BR>所以我的问题是:有没有一种方法可以在swift中创建一个真正的单例类,在这个类中只有一个实例在系统范围内是可能的?


只需将初始值设定项声明为私有:

1
private init() {}

现在只能从同一文件中创建新实例。


你误解了单身的本质。独生子的目的是提供独生子,而不是防止邪恶。我可以用另一个ui应用程序来代替sharedApplication,但这很愚蠢,因为它不是sharedApplication。我可以用另一个nsnotificationcenter来代替defaultCenter,但这很愚蠢,因为它不是defaultCenter。重点不是阻止我的愚蠢,而是提供一个工厂单件,这就是你已经在做的。别担心,开心点。


全局变量,嵌套结构,调度一次。选择一个。

The lazy initializer for a global variable (also for static members of
structs and enums) is run the first time that global is accessed, and
is launched as dispatch_once to make sure that the initialization is
atomic. This enables a cool way to use dispatch_once in your code:
just declare a global variable with an initializer and mark it
private.

1
2
3
4
5
6
private let _singletonInstance = SingletonClass()
class SingletonClass {
  class var sharedInstance: SingletonClass {
    return _singletonInstance
  }
}

更多信息在这里。网址:https://github.com/hpique/swiftsingleton