gpt4 book ai didi

swift - 具有可抛出初始化器的单例

转载 作者:行者123 更新时间:2023-11-28 10:11:35 24 4
gpt4 key购买 nike

我有一个单例:

public class Manager {
static let shared = Manager()
private init() {
...
}
}

其他类可以通过以下方式访问它:

Manager.shared

这里没问题。现在,我开始思考,如果私有(private)初始化程序是可抛出的怎么办?

public class Manager {
// Compiler error: Call can throw, but erros cannot be thrown out of global variable initializer
static let shared = Manager()

// throwable initialier
private init() throws {
...
}
}

如果我仍然希望 Manager 是单例的,如何解决上述错误?

最佳答案

许多可能的解决方案之一是让共享变量成为一个Optional 并使用try? 关键字调用初始化程序。

像这样:

public class Manager {
static let shared: Manager? = try? Manager()

// throwable initialier
private init() throws {
...
}
}

编辑:如果你想在上次调用 init 失败时尝试重新创建对象,你可以这样写。

public class Manager {
static var shared: Manager? {
get {
if instance == nil {
instance = try? Manager()
}
return instance
}
}

static private var instance: Manager? = try? Manager()

// throwable initialier
private init() throws {
...
}
}

关于swift - 具有可抛出初始化器的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47347710/

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