You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift如何实现根据ObservableObject的score变量动态返回不同数组

问题原因

  • 你在myFunc内部单独实例化了GameSettings,和其他视图用的不是同一个实例,数据完全不互通
  • @StateObject是SwiftUI专为View属性设计的包装器,不能在普通函数内部声明,不会生效
  • View1中用let固定初始化array,后续score变化不会触发array重新取值,视图不会更新

正确实现步骤

1. 调整myFunc逻辑,移除内部实例化的settings,改为通过参数传入当前score值

func myFunc(score: Int) -> [arrayModel] {
    if score == 1 {
        // 替换为score为1时的实际数组内容
        return [arrayModel(example: example)]
    } else if score == 2 {
        // 替换为score为2时的实际数组内容
        return [arrayModel(example: example)]
    }
    // 补充默认返回值避免编译报错
    return []
}

2. 重写View1,注入全局共用的GameSettings实例,将array改为动态计算属性

struct View1: View {
    // 如果实例从父视图传入用@ObservedObject,若放在全局环境用@EnvironmentObject
    @ObservedObject var settings: GameSettings
    // 计算属性会在settings.score更新时自动重新计算,拿到对应数组
    private var array: [arrayModel] {
        myFunc(score: settings.score)
    }
    
    var body: some View {
        VStack {
            Text("\(settings.score)")
            List {
                // 补充id参数避免遍历警告
                ForEach(0..<array.count, id: \.self) { section in
                    NavigationLink(destination: RowDetailView(array: array[section])) {
                        RowView(array: array[section])
                    }
                }
            }
        }
    }
}

3. 父视图调用时传入全局共用的GameSettings实例

你需要确保View1使用的GameSettings和其他页面是同一个实例,父视图调用示例:

// 父视图中保留全局的GameSettings实例
@StateObject private var globalSettings = GameSettings()

// 展示View1时传入实例
View1(settings: globalSettings)

完成以上修改后,只要score值发生变化,就会触发View1刷新,自动调用myFunc拿到对应数组,视图内容会同步更新。

内容的提问来源于stack exchange,提问作者Carl Bryers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 13:36:05