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

