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
相关产品推荐
相关产品推荐

