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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:01:29