如何绑定到初始化期间创建的
ObservableObject
?
我想确保将特定值捕获为
@Binding
/@State
变量(因此它始终在视图中保持更新),但是在通过在 also 期间创建的对象进行绑定时遇到错误相同的初始化。例如:
RandomOptionsManager
是一个 ObservableObject
,它从文件加载选项列表:
class RandomOptionsManager: ObservableObject {
@Published var listCount: Int = 0
init() {
// Real code would load the list from a file
self.listCount = 150
}
}
...然后
Randomizer
使用这些对象之一来生成结果。作为其代码的一部分,此类对可用选项的数量进行了计数,我试图从选项管理器中的 @Binding
var 中将其作为 @Published
获取:
class Randomizer: ObservableObject {
@ObservedObject var optionsManager = RandomOptionsManager()
@Binding var listCount: Int
init() {
self._listCount = $optionsManager.listCount
}
}
但是,此代码会导致初始化错误:
在初始化所有存储的属性之前,在属性访问“$optionsManager”中使用“self”
避免此问题的正确配置是什么?
或者期望我真的应该放弃这种方法并将
RandomOptionsManager
作为 @EnvironmentObject
注入?这感觉好像损害了这里的模块化。
正如问题评论中所建议的,这可以通过避免
@Binding
和 @ObservedObject
(它们实际上用于视图,而不是像这样的其他类)并使用 [assign(to:)][1]
将 optionsManager 的 @Published var
重新发布为新的来解决随机发生器内的属性。
这只需要更改
Randomizer
的代码。 RandomOptionsManager
的代码与问题中的代码相同:
class Randomizer: ObservableObject {
@Published var listCount: Int = 0
private let optionsManager = RandomOptionsManager()
init() {
optionsManager.$listCount.assign(to: &self.$listCount)
}
}