SwiftUI跨视图共享字典遇@Main/WindowGroup参数错误求解
解决方案
错误1:ScenarioView初始化器私有不可访问
- 检查
ScenarioView的定义:如果是struct类型,若内部包含private修饰的存储属性,Swift会自动生成私有初始化器。解决方法是显式声明一个非私有的初始化方法:struct ScenarioView: View { let scenario: Scenario let outputOverview: OutputOverview // 显式声明初始化器,替代私有合成初始化器 init(scenario: Scenario, outputOverview: OutputOverview) { self.scenario = scenario self.outputOverview = outputOverview } // 视图body实现... } - 若
ScenarioView是跨模块调用(比如在框架里定义),需要给初始化器加上public修饰:public init(scenario: Scenario, outputOverview: OutputOverview) { self.scenario = scenario self.outputOverview = outputOverview }
错误2:Scenario类型无法转换为OutputOverview
- 先确认
ScenarioView的参数要求:打开ScenarioView的定义,检查它期望接收的参数类型。根据实际情况做适配:- 如果
Scenario包含OutputOverview的实例,直接取对应属性传入:// 假设Scenario有outputOverview属性 let sampleScenario = Scenario(...) ScenarioView(scenario: sampleScenario, outputOverview: sampleScenario.outputOverview) - 如果需要从
Scenario生成OutputOverview,写一个转换方法:extension Scenario { func toOutputOverview() -> OutputOverview { // 根据Scenario的数据生成对应的OutputOverview实例 OutputOverview(...) } } // 调用时 let sampleScenario = Scenario(...) ScenarioView(scenario: sampleScenario, outputOverview: sampleScenario.toOutputOverview()) - 若
ScenarioView本就应该接收Scenario,直接修改它的初始化器参数类型:struct ScenarioView: View { let scenario: Scenario init(scenario: Scenario) { self.scenario = scenario } // body实现... }
- 如果
跨视图数据共享建议
针对你需要跨视图共享Cell/Info/Scenario/OutputOverview的需求,推荐用ObservableObject封装全局状态,通过EnvironmentObject传递,避免手动传参出错:
class AppState: ObservableObject { @Published var currentScenario: Scenario @Published var currentOutput: OutputOverview init(scenario: Scenario, output: OutputOverview) { self.currentScenario = scenario self.currentOutput = output } } // 在App入口注入 @main struct GridApp: App { @StateObject private var appState = AppState( scenario: Scenario(...), // 模拟数据 output: OutputOverview(...) ) var body: some Scene { WindowGroup { ScenarioView() .environmentObject(appState) } } } // 在ScenarioView中使用 struct ScenarioView: View { @EnvironmentObject private var appState: AppState var body: some View { // 直接使用appState.currentScenario、appState.currentOutput Text(appState.currentScenario.name) } }
内容的提问来源于stack exchange,提问作者quoteunquote
相关产品推荐
相关产品推荐

