gpt4 book ai didi

swift - 两阶段初始化死锁 : how to init class's properties before super. init() 如果你必须调用 self.someMethod() 来初始化它们?

转载 作者:行者123 更新时间:2023-11-28 07:43:17 25 4
gpt4 key购买 nike

对 Swift 的两阶段初始化感到困惑。

  • 你应该在 super.init() 调用之前初始化所有属性
  • 要初始化它,您必须调用一些私有(private)方法(此方法需要用于重用目的,并且您不想也膨胀 init() 方法)
  • 要调用您的私有(private)方法,您首先要调用 super.init()。死锁。

这是无法编译的示例代码:

class A:NSObject {
private var url1:URL
private var url2:URL
let settings:Dictionary<String, String>

init(setting:Dictionary<String, String>) {
self.configureAddresses()
super.init()
}

private func configureAddresses() {
/* ...some long and difficult reusable somewhere in this class configuration code... */
self.url1 = URL(string:"result")!
self.url2 = URL(string:"result")!
}
}

附注我知道我可以在 super.init() 调用之前分配 stub 值,然后重新配置它们,但是如果我有一些非平凡类型(如 URL 或我的自定义类)的属性,那就太丑陋了。

最佳答案

选项 1:

给定的代码表明 URL 是用常量预定义的,所以直接声明它们

class A:NSObject {
private var url1 = URL(string:"result")!
private var url2 = URL(string:"result")!

选项 2:

文字字符串依赖于字典中的另一个值,然后将变量延迟声明为可选。

class A:NSObject {
private lazy var url1 : URL? = {
guard let result = settings["result"] as? String else { return nil }
return URL(string: result)
}()

在两个选项中交换 init 中的顺序

init(setting:Dictionary<String, String>) {
super.init()
self.configureAddresses()
}

关于swift - 两阶段初始化死锁 : how to init class's properties before super. init() 如果你必须调用 self.someMethod() 来初始化它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51631840/

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