Core Data环境下仅累加状态为True的数据值实现问题
解决方法
有两种方式实现只累加状态为True的数据项数值,根据你的场景选择合适的方案:
方式1:在现有数组中筛选后累加
如果ViewController.liste已经是从Core Data获取到的对象数组,直接在reduce逻辑里加入状态判断即可。注意把"isActive"替换成你Core Data实体中实际表示True/False状态的属性名:
func printData() { // 仅累加状态为true的项的gewicht值 let sum = ViewController.liste.reduce(0) { total, item in // 取出状态属性,替换成你实际的属性名,比如"isSelected" let isActive = item.value(forKey: "isActive") as? Bool ?? false return isActive ? total + (item.value(forKey: "gewicht") as? Double ?? 0) : total } print("Gesamtgewicht: \(sum) kg") gewicht = sum gewichtLabel.text = "\(gewicht) kg" if gewicht > 3500 { gewichtLabel.textColor = .red } }
方式2:通过Core Data直接筛选并聚合(更高效)
如果数据量较大,推荐直接让Core Data完成过滤和总和计算,避免把所有对象加载到内存。提供两种细分方案:
方法A:用聚合请求直接计算总和
func printData() { let context = // 获取你的Core Data上下文 // 创建聚合查询请求 let request: NSFetchRequest<NSFetchRequestResult> = Gegenstand.fetchRequest() request.resultType = .dictionaryResultType // 过滤状态为true的项 request.predicate = NSPredicate(format: "isActive == YES") // 替换成你的状态属性名 // 定义总和计算表达式 let sumExpression = NSExpression(forFunction: "sum:", arguments: [NSExpression(forKeyPath: "gewicht")]) let sumDesc = NSExpressionDescription() sumDesc.name = "totalWeight" sumDesc.expression = sumExpression sumDesc.expressionResultType = .doubleAttributeType request.propertiesToFetch = [sumDesc] // 执行请求 do { let results = try context.fetch(request) as! [[String: Double]] let sum = results.first?["totalWeight"] ?? 0 print("Gesamtgewicht: \(sum) kg") gewicht = sum gewichtLabel.text = "\(gewicht) kg" if gewicht > 3500 { gewichtLabel.textColor = .red } } catch { print("计算总和失败:\(error)") } }
方法B:先过滤数据再累加
func printData() { let context = // 获取你的Core Data上下文 do { // 创建请求并过滤状态为true的项 let request: NSFetchRequest<Gegenstand> = Gegenstand.fetchRequest() request.predicate = NSPredicate(format: "isActive == YES") // 替换成你的状态属性名 let filteredItems = try context.fetch(request) // 如果生成了NSManagedObject子类,直接用属性名(如$1.gewicht)更安全易读 let sum = filteredItems.reduce(0) { $0 + ($1.value(forKey: "gewicht") as? Double ?? 0) } print("Gesamtgewicht: \(sum) kg") gewicht = sum gewichtLabel.text = "\(gewicht) kg" if gewicht > 3500 { gewichtLabel.textColor = .red } } catch { print("获取数据失败:\(error)") } }
提示:如果你的Core Data实体生成了子类(推荐做法),建议直接用属性名调用(比如
$1.gewicht、$1.isActive),比value(forKey:)更安全,代码可读性也更强。
内容的提问来源于stack exchange,提问作者Guenni
相关产品推荐
相关产品推荐

