在 Swift 中理解单例
Understanding Singleton in Swift
我正在尝试在 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")
}
我已经使用计算类型属性创建了一个单例(从另一个 Whosebug 问题中了解到)。截至目前,输出是 "Pointing to different instance"。
我正在寻找的是上面示例中的 "a" 和 "b" 指向 GLOBAL class 的不同实例,这打破了单例的要点。如何使上面示例中的 "a" 和 "b" 指向 class 的同一个实例。
谢谢
此模式不保证 Global
class 只会出现一个实例。它只允许任何人通过 sharedinstance
属性.
访问 Global
的单个公共实例
因此 Global()
声明了 Global
class 的新实例。但是 Global.sharedinstance
不会创建 Global
的新实例,只是获取一个预先创建的实例(这是在任何人第一次访问它时创建的)。
(如果您将 b
的声明更改为 var b = Global.sharedinstance
,您会看到它确认 a
和 b
指向同一实例。)
如果您想禁止创建 Global
的更多实例,请将其 init
设为私有:
private init() { }
但请记住,您仍然可以从声明它的文件中创建其他 Globals
,因此如果您在 playground 或单文件测试项目中执行上述操作,你不会看到任何效果。
Class App 生命周期内实例一次。
class AccountManager {
static var sharedInstance = AccountManager()
var userInfo = (ID:"Arjun",Password:"123")
private init(){
print("allocate AccountManager")
}
}
这里我们设置Private 因为:
私有访问将实体的使用限制为封闭声明,以及同一文件中该声明的扩展。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
同时设置 sharedInstance
的 static 属性
因为如果你需要在没有 class 实例的情况下访问 class 属性 你必须声明 "Static".
我正在尝试在 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")
}
我已经使用计算类型属性创建了一个单例(从另一个 Whosebug 问题中了解到)。截至目前,输出是 "Pointing to different instance"。
我正在寻找的是上面示例中的 "a" 和 "b" 指向 GLOBAL class 的不同实例,这打破了单例的要点。如何使上面示例中的 "a" 和 "b" 指向 class 的同一个实例。
谢谢
此模式不保证 Global
class 只会出现一个实例。它只允许任何人通过 sharedinstance
属性.
Global
的单个公共实例
因此 Global()
声明了 Global
class 的新实例。但是 Global.sharedinstance
不会创建 Global
的新实例,只是获取一个预先创建的实例(这是在任何人第一次访问它时创建的)。
(如果您将 b
的声明更改为 var b = Global.sharedinstance
,您会看到它确认 a
和 b
指向同一实例。)
如果您想禁止创建 Global
的更多实例,请将其 init
设为私有:
private init() { }
但请记住,您仍然可以从声明它的文件中创建其他 Globals
,因此如果您在 playground 或单文件测试项目中执行上述操作,你不会看到任何效果。
Class App 生命周期内实例一次。
class AccountManager {
static var sharedInstance = AccountManager()
var userInfo = (ID:"Arjun",Password:"123")
private init(){
print("allocate AccountManager")
}
}
这里我们设置Private 因为:
私有访问将实体的使用限制为封闭声明,以及同一文件中该声明的扩展。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
同时设置 sharedInstance
的 static 属性因为如果你需要在没有 class 实例的情况下访问 class 属性 你必须声明 "Static".