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

SwiftUI中ForEach过滤布尔值问题:仅显示true项失败

解决SwiftUI ForEach显示所有条目问题

嘿,我一眼就发现问题所在啦——你当前的代码只是遍历了数组的所有索引,完全没对show属性做过滤判断,所以不管show是true还是false,所有条目都会被渲染出来!

解决方案1:先过滤数组再遍历(推荐)

既然你的txt结构体已经遵循了Identifiable协议,我们可以先通过filter方法筛选出show为true的元素,再用ForEach遍历这个过滤后的集合,代码更简洁高效:

struct ContentView: View {
    @State private var array = [
        txt(id: 000, text: "True", show: true),
        txt(id: 001, text: "True", show: true),
        txt(id: 002, text: "True", show: true),
        txt(id: 003, text: "False", show: false),
    ]
    var body: some View {
        NavigationView {
            List {
                // 先过滤出show为true的元素,再遍历
                ForEach(array.filter { $0.show }) { item in
                    Text(item.text)
                }
            }
        }
    }
}

解决方案2:遍历索引时添加条件判断

如果你一定要保留遍历索引的写法,那可以在ForEach内部加上if判断,只渲染show为true的条目:

ForEach(array.indices, id: \.self) { idx in
    if self.array[idx].show {
        Text("\(self.array[idx].text)")
    }
}

不过这种方式的效率不如第一种,因为ForEach还是会遍历数组的所有索引,只是跳过不符合条件的渲染逻辑。

小建议:遵循Swift命名规范

顺便提一句,Swift里结构体的命名建议采用大驼峰命名法,比如把txt改成Txt,这样代码的可读性会更好哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:07:27