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

SwiftUI中如何按priority过滤@EnvironmentObject任务数组填充列表

实现方案

你原有代码存在以下核心问题:

  • 不能在视图的存储属性中直接访问@EnvironmentObject,视图初始化阶段环境对象尚未完成注入,会触发运行时错误
  • filter闭包逻辑错误:误用赋值运算符=而非相等判断==,且不需要通过$前缀访问taskdata.tasks($是用来获取Binding类型的,普通读取直接访问属性即可)
  • 静态存储属性无法响应byPriority或taskdata.tasks的变化,不会自动重新过滤数据
  • 变量名拼写错误:byPriotity应为byPriority,避免调用时报未找到属性的错误

以下是可直接运行的实现代码:

struct TasksView: View {
    
    @EnvironmentObject private var taskdata: DataModel
    // 修正拼写错误
    @State var byPriority: Int
    
    // 改用计算属性,每次视图刷新时动态过滤,自动响应数据变化
    private var filteredTasks: [Task] {
        taskdata.tasks.filter { task in
            task.priority == byPriority
        }
    }
    
    var body: some View {
        // 直接把过滤后的数组作为列表数据源
        List(filteredTasks) { task in
            // 任务项视图示例,可按需求修改
            HStack {
                Text(task.title)
                Spacer()
                if task.completed {
                    Image(systemName: "checkmark.circle.fill")
                        .foregroundColor(.green)
                }
            }
        }
        // 优先级切换按钮示例,点击自动重新过滤刷新列表
        .toolbar {
            HStack(spacing: 16) {
                Button("低优") { byPriority = 1 }
                Button("中优") { byPriority = 2 }
                Button("高优") { byPriority = 3 }
            }
        }
    }
}

如果需要支持显示所有优先级,可以扩展过滤逻辑:

private var filteredTasks: [Task] {
    // 假设byPriority为0时显示全部任务
    if byPriority == 0 {
        return taskdata.tasks
    }
    return taskdata.tasks.filter { $0.priority == byPriority }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:24:03