gpt4 book ai didi

Swift - 无法在单例中初始化对象

转载 作者:行者123 更新时间:2023-11-30 13:24:57 24 4
gpt4 key购买 nike

我有一个对象

class MyObject: NSObject {
// some properties

override init() {
super.init() // not to init other properties here
print("MyObject init!")
}
}

和一个单例:

class Singleton: NSObject {
static let sharedInstance = Singleton()
var obj: MyObject?

private override init() {
obj = MyObject()
print("obj init")
}
}

仅当我注释掉 obj = MyObject() 时,我的应用程序才能运行(打印 obj init)。如果我不将其注释掉,应用程序将显示一个空白屏幕,请注意 MyObject init 不会打印。

您能告诉我问题以及如何解决吗?

非常感谢。

--更新--

我可以在 didFinishLaunchingWithOption 或任何其他 ViewController 的 viewDidLoad 中初始化 obj:

private let singleton = Singleton.sharedInstance

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

// FIXME: - This should be initialized in Singleton
singleton.obj = MyObject()

return true
}

最佳答案

这是创建 Swift Singleton 的方法:

class Singleton: NSObject {
private static let sharedInstance = Singleton()
private var _obj: MyObject?
public var obj : MyObject {
get {
if _obj == nil {
_obj = MyObject()
}
return obj
}
private override init() {
super.init()
//Do some stuff here
print("obj init")
}
}

现在您只需使用Singleton.sharedInstance.obj

但是更好的实现是:

class MyObject: NSObject {
private var _obj: MyObject?
public var sharedInstance : MyObject {
get {
if _obj == nil {
_obj = MyObject()
}
return obj
}
private override init() {
super.init()
//Do some stuff here
print("obj init")
}
}

这让您可以使用:MyObject.sharedInstance,它比Singleton.sharedInstance.obj

更好

关于Swift - 无法在单例中初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com