gpt4 book ai didi

swift - 使用由单例组成的默认值初始化 UIViewController

转载 作者:行者123 更新时间:2023-11-30 12:26:11 27 4
gpt4 key购买 nike

尝试重构我的代码以避免到处引用共享实例,而我想通过自定义初始化程序注入(inject)它们。我对 Swift 初始化的有限理解阻碍了我这样做。

这是我的 ViewController,减去方法和样板:

class LoginVC: UIViewController {
let dataManager: DataManager
let restManager: RestManager
let defaults: UserDefaults

init(defaults: UserDefaults = .standard, dataManager: DataManager = .sharedInstance, restManager: RestManager = .sharedInstance) {
self.defaults = defaults
self.dataManager = dataManager
self.restManager = restManager
super.init(nibName: nil, bundle: nil)
}
}

我提供了默认值,它们是在各自的 DataManager 和 RestManager 单例类中声明为静态常量的共享实例。计划在每个引用这些单例的 ViewController 中执行此操作。无论如何,当编译器提示我必须提供所需的初始化程序 init(coder: aDecoder) 时,我的问题就出现了。

没问题,但是实现后...

    required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

...编译器再次提示,这次是

Blockquote Property 'self.defaults' not initialized at super.init call

我认为这是有道理的,因为需要初始化?据我所知,是一个委托(delegate)初始化(可能我在这里完全错了)。我不知道如何将自定义 init 的默认参数传递给此初始化程序的 super init,或者是否可能。

我尝试了一种解决方法,将常量更改为可变变量并让它们隐式展开,如下所示:

class LoginVC: UIViewController {
var dataManager: DataManager!
var restManager: RestManager!
var defaults: UserDefaults!

init(defaults: UserDefaults = .standard, dataManager: DataManager = .sharedInstance, restManager: RestManager = .sharedInstance) {
self.defaults = defaults
self.dataManager = dataManager
self.restManager = restManager
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}

此解决方法实际上可以编译和构建,但是一旦 viewDidLoad 中的 userDefaults 被解包,应用程序就会崩溃,因为它们具有 nil 值。尽管它们在自定义初始化程序的参数中默认存在,但它们都具有 nil 值,这让我相信我已经彻底搞砸了。

任何帮助/澄清将不胜感激,提前致谢。

最佳答案

不确定这是否是您想要做的,但我建议您使用这个解决方案

extension UIViewController {

var defaults: UserDefaults {
get {
return .standard
}
}
}

因此,在每个 UIViewController 中,您可以执行 self.defaults

如果您希望某些 UIViewControllers 有其他引用,您可以这样做

//create protocol with all vars
protocol References {
var defaults: UserDefaults {get}
}

//create extension with default implementation
extension References {
var defaults: UserDefaults {
get {
return .standard
}
}
}

//add this protocol to all UIViewControllers
extension UIViewController: References {
}

//or create new class with references
class ReferenceViewController: UIViewController, References {
}

//override reference in some view controller if needed
class AnotherReferencesViewController: UIViewController { //or ReferenceViewController
var defaults: UserDefaults {
get {
//something new
return .standard
}
}
}

关于swift - 使用由单例组成的默认值初始化 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44189207/

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