在 Init() 期间从另一个 @ObservableObject 发布 Var

问题描述 投票:0回答:1

如何从另一个

ObservableObject
发布在初始化期间创建的属性?

我想确保将特定值捕获为

@Published
/
@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
注入?这感觉好像损害了这里的模块化。

swift swiftui binding initialization swiftui-state
1个回答
0
投票

正如问题评论中所建议的,这可以通过避免

@Binding
@ObservedObject
(它们实际上用于视图,而不是像这样的其他类)并使用
assign(to:)
重新发布 optionsManager 的
@Published var
来解决一个新的财产。

这只需要更改

Randomizer
的代码(
RandomOptionsManager
的代码保持不变):

class Randomizer: ObservableObject {
    
    @Published var listCount: Int = 0
    private let optionsManager = RandomOptionsManager()
    
    init() {
        optionsManager.$listCount.assign(to: &self.$listCount)
    }
}

请注意,

assign(to:)
自动处理生命周期管理,因此不需要单独显式分配给
cancellable

© www.soinside.com 2019 - 2024. All rights reserved.