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

SwiftUI如何将筛选后的结构体数据正确传递给其他视图

问题原因

错误出在ForEach的索引使用逻辑上:
filter返回的new是独立于原items的新数组,遍历new.indices得到的是新数组自身的元素索引,不是对应元素在原items数组中的位置。用这个索引去原数组通过下标取值,取到的永远是原数组对应位置的元素,和筛选条件没有关系。

用你提供的测试数据举例:

  • 原数组索引0:status=1,名称Inprogress
  • 原数组索引1:status=0,名称New
  • 筛选后的new数组只有1个元素,自身索引为0
  • 代码用索引0取原数组元素,拿到的永远是排在第一位的Inprogress,自然不会显示符合条件的新任务
修复方法

方法1:直接遍历筛选后的数组(推荐)

你的Tasks已经实现了Identifiable协议,不需要依赖索引遍历,直接遍历筛选后的数组即可。需要传绑定值时,直接从筛选后的数组取绑定,不要回原数组按下标取值。
将Section块中的代码替换为如下内容:

Section(header:Text("\(size) New")){
    ForEach($new) { $item in
        NavigationLink(destination: ChosenTask()) {
            CardContentView(item: $item)
        }
    }
}

方法2:筛选原数组的合法索引

如果习惯用索引遍历,不要先筛元素再拿新数组索引,直接从原数组中筛选出符合条件的索引值,再遍历这些索引访问原数组:

Section(header:Text("\(size) New")){
    let matchIndexes = items.indices.filter { items[$0].status == 0 }
    ForEach(matchIndexes, id: \.self) { idx in
        NavigationLink(destination: ChosenTask()) {
            CardContentView(item: self.$items[idx])
        }
    }
}
  • 额外提示:ContentsView顶层定义的var size = 0是无用代码,全程没有被赋值和引用,可以直接删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:48:34