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

SwiftUI中如何对过滤后的CoreData查询结果的Double属性求和

问题修复方案

错误原因

  • 你当前的写法混淆了单条数据和数据集的操作:ForEach遍历到的value是单条FeedList实例,它的feedquant是单个Double值,不是集合,无法调用reduce方法
  • 求和逻辑的位置错误:对整个过滤后数据集的求和不该写在ForEach的循环体内,SwiftUI的body只能返回符合View协议的内容,错误的逻辑写法会导致编译器判定返回值不符合要求,抛出你遇到的类型不匹配错误

修复后的代码

import SwiftUI
import Foundation
import CoreData

struct FilteredList: View {
    var fetchRequest: FetchRequest<FeedList>
    // 过滤后的数据集
    var filteredFeeds: FetchedResults<FeedList> {
        fetchRequest.wrappedValue
    }
    // 总和改为计算属性,直接对整个过滤后的数据集累加feedquant
    var totalFeedQuant: Double {
        filteredFeeds.reduce(0.0) { partialResult, feed in
            partialResult + feed.feedquant
        }
    }
    
    var body: some View {
        VStack(alignment: .leading) {
            // 先展示总和
            Text("指定日期总投喂量:\(totalFeedQuant)")
                .font(.headline)
            // 再遍历展示每条数据
            ForEach(filteredFeeds, id: \.self) { feed in
                Text("单条投喂量:\(feed.feedquant)")
            }
        }
    }
    
    init(filter: String) {
        fetchRequest = FetchRequest<FeedList>(entity:
           FeedList.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \FeedList.compdate, ascending: false)],
         predicate: NSPredicate(format: "compdate == %@", filter))
    }
}

可选优化说明

如果数据量很大,也可以直接用CoreData的聚合查询直接计算总和,不需要把所有数据加载到内存中,性能更好:你可以通过NSExpressionDescription构造聚合查询,直接通过ManagedObjectContext执行查询拿到总和结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:24:02