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

SwiftUI中筛选showItem为true的Item到新数组及ForEach错误修复

修复SwiftUI中Type '()' cannot conform to 'View'错误

需求

将Item结构体中showItem属性为true的元素筛选到新数组中。

数据模型定义

struct ListModel: Identifiable, Hashable {
    var id = UUID()
    var name:String
    var amount:Int
    var code:String
    var users:[User]
    var items:[Item]

}

struct User: Identifiable, Hashable{
    var id = UUID()
    var foreName:String
    var surName:String
    var username:String
    var pfp:String
}

struct Item:Identifiable, Hashable{
    var id = UUID()
    var name:String
    var image:String?
    var showItem:Bool
    var amount:String
} 

尝试实现的代码

import SwiftUI

struct ListTest: View {
    
    var list:ListModel
    @State var nonHiddenItems:[Item] = []
    
    var body: some View {
        VStack{
            ForEach(0..<list.items.count){item in
                ItemView(item: list.items[item])
            }
        }
        .onAppear(){
            ForEach(0..<list.items.count){item in
                if list.items[item].showItem == true{
                    nonHiddenItems.append(list.items[item])
                }
                
            }
        }
    }
}

struct ListTest_Previews: PreviewProvider {
    static var previews: some View {
        ListTest(list: ListModel(name: "Family Shopping", amount: 0, code: "1001", users: [User(foreName: "Elon", surName: "Musk", username: "Elon123", pfp: "Musk"), User(foreName: "Jeff", surName: "Bezos", username: "Jefferey", pfp: "Bezos")], items: [Item(name: "Cheese", image: "Pizza", showItem: true, amount: "5g"), Item(name: "Ham", showItem: false, amount: "5g")]))
    }
}

错误说明

运行时出现错误:Type '()' cannot conform to 'View',该错误出现在onAppear中的ForEach循环处。

修复方案

问题原因

SwiftUI中的ForEach是视图构建组件,仅用于生成View序列,不能在onAppear这类纯逻辑代码的闭包里当作普通循环使用。闭包中需要使用标准Swift循环或高阶函数处理数据。

两种修复方式

方式1:使用filter高阶函数(更简洁)

直接通过filter筛选出showItem为true的元素,赋值给nonHiddenItems:

.onAppear(){
    nonHiddenItems = list.items.filter { $0.showItem }
}

方式2:使用普通for-in循环

如果需要更明确的循环逻辑,用标准for循环遍历:

.onAppear(){
    for item in list.items {
        if item.showItem {
            nonHiddenItems.append(item)
        }
    }
}

修复后的完整代码示例

import SwiftUI

struct ListTest: View {
    
    var list:ListModel
    @State var nonHiddenItems:[Item] = []
    
    var body: some View {
        VStack{
            ForEach(0..<list.items.count){item in
                ItemView(item: list.items[item])
            }
        }
        .onAppear(){
            // 使用filter简化筛选
            nonHiddenItems = list.items.filter { $0.showItem }
        }
    }
}

struct ListTest_Previews: PreviewProvider {
    static var previews: some View {
        ListTest(list: ListModel(name: "Family Shopping", amount: 0, code: "1001", users: [User(foreName: "Elon", surName: "Musk", username: "Elon123", pfp: "Musk"), User(foreName: "Jeff", surName: "Bezos", username: "Jefferey", pfp: "Bezos")], items: [Item(name: "Cheese", image: "Pizza", showItem: true, amount: "5g"), Item(name: "Ham", showItem: false, amount: "5g")]))
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:20:33