了解Swift中的Singleton

时间:2015-01-04 18:44:21

标签: swift singleton

我正在尝试在SWIFT中创建一个单例,这是我到目前为止所做的

class Global {

    class var sharedInstance:Global {

        struct singleton {

            static let instance:Global = Global()
        }

        return singleton.instance
    }


}

var a = Global.sharedInstance
var b = Global()

if a === b {

    println("Pointing to Same Instance")
}
else {

    println("Pointing to different instance")
}

我使用了计算类型属性来创建一个单例(从另一个stackoverflow问题中学到了)。截至目前,输出是“指向不同的实例”。

我正在寻找的是上面例子中的“a”和“b”指向GLOBAL类的不同实例,这打破了单身人士的观点。如何在上面的例子中使“a”和“b”指向同一个类的实例。

谢谢

2 个答案:

答案 0 :(得分:3)

此模式不保证只有Global类的一个实例。它只允许任何人通过其Global属性访问sharedinstance的单个公共实例。

因此Global()声明了Global类的新实例。但Global.sharedinstance不会创建Global的新实例,只会获取预先创建的实例(在第一次访问时创建)。

(如果您将b的声明更改为var b = Global.sharedinstance,则会看到它确认ab指向同一个实例。)

如果您要禁止创建Global的更多实例,请将其init设为私有:

    private init() {  }

但请记住,你仍然可以在声明它的文件中创建其他Globals,所以如果你在游乐场或单文件测试项目中进行上述操作,那么你赢了看不出任何效果。

答案 1 :(得分:0)

类实例在应用程序生命周期中一次。

class AccountManager {
    static var sharedInstance = AccountManager()
    var userInfo = (ID:"Arjun",Password:"123")

    private init(){
       print("allocate AccountManager")
    }
}

在这里我们设置私有是因为:

私有访问将实体的使用限制为封闭的声明以及该声明在同一文件中的扩展名。当仅在单个声明中使用特定功能的实现细节时,请使用私有访问权限来隐藏这些细节。

还设置了sharedInstance的 static 属性

因为如果您需要在没有类实例的情况下访问类属性,则必须声明“静态”。