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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:37:15