Core Data遍历报错:Item类型不存在price2pay成员,求修复方案
问题修复方案
1. 直接报错原因:属性名大小写错误
你在forLoop函数里写的i.price2pay是小写的pay,但Core Data生成的Item实体属性是驼峰命名的price2Pay(第二个P大写)——这点你在视图代码里已经正确使用了(product.price2Pay),所以只需要把错误处的price2pay改成price2Pay。
2. 核心逻辑错误:函数内不能使用View专属属性包装器
@FetchRequest和@Environment(\.managedObjectContext)是SwiftUI View专属的属性包装器,不能在普通函数(比如你写的forLoop)里直接声明使用,这会导致编译失败。同时try!强制解包风险极高,应该处理属性的可选值。
修复后的正确实现方式
删掉无效的forLoop函数,把计算小计的逻辑放到CartView内部,推荐用计算属性实现(自动响应数据变化):
struct CartView: View { @FetchRequest(sortDescriptors: []) var checkout: FetchedResults<Item> @Environment(\.managedObjectContext) var moc // 用计算属性自动计算小计,无需手动维护@State变量 var subTotal: Int32 { checkout.reduce(0) { total, item in total + (item.price2Pay ?? 0) // 处理可选值,避免崩溃 } } // 移除原来的@State var subTotal和productPrices var body: some View { NavigationStack { List { ForEach(checkout) { product in VStack(alignment: .leading, spacing: 8) { Text(product.name ?? "Chicken Biryani") .font(.system(size: 20, design: .rounded).bold()) Text("Quantity: \(product.qty)") .font(.callout.bold()) Text("Price of Each: £\(Int32(product.price))") .font(.callout.bold()) Text("Price to pay: £\(product.price2Pay ?? 0)") // 同样处理可选值 .font(.callout.bold()) } .swipeActions { Button(role: .destructive) { // 简化删除逻辑,直接删除product即可 moc.delete(product) Task { do { try moc.save() } catch { print(error.localizedDescription) } } } label: { Label("Delete", systemImage: "trash.fill") } } .frame(maxWidth: .infinity, alignment: .leading) } } HStack() { Text("Subtotal: ") .padding(.horizontal) Spacer() Text("£\(subTotal).00") .padding(.horizontal) Spacer() NavigationLink(destination: PurchaseView()) { HStack { Image(systemName: "creditcard.and.123") .symbolVariant(.fill) Divider() .padding(.vertical, 8) Text("Proceed to Buy") } .frame(minWidth: 150, maxHeight: 55) .background(.mint) .foregroundColor(.white) .clipShape(RoundedRectangle(cornerRadius: 8)) } } } .navigationTitle("Checkout") } }
3. 额外优化点
- 删除逻辑简化:不需要调用
existingObject(with:),直接用moc.delete(product)即可,因为product本身就是Core Data管理的对象实例。 - 可选值处理:Core Data属性默认是可选类型,使用时加上
?? 0兜底,避免因属性为nil导致崩溃。 - 移除冗余变量:原来的
@State var subTotal和productPrices可以删掉,用计算属性自动计算更简洁可靠。
内容的提问来源于stack exchange,提问作者Sricharan Ponna
相关产品推荐
相关产品推荐

