SwiftUI:按核心数据属性分组和求和

Posted

技术标签:

【中文标题】SwiftUI:按核心数据属性分组和求和【英文标题】:SwiftUI: Group and Sum by Core Data Attribute 【发布时间】:2021-04-13 22:03:34 【问题描述】:

问题是:如何按属性对 Core Data 对象进行分组,然后对它们执行简单的计算(比如说求和)?

我为此找到了一些类似的答案(例如 this one),但似乎没有一个结论性的答案,而且所有人都在为 Swift 做好准备(而我正在研究 SwiftUI)。

例如,我有一个如下所示的核心数据模型:

extension Items 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Items> 
        return NSFetchRequest<Items>(entityName: "Items")
    

    @NSManaged public var id: UUID?
    @NSManaged public var cost: Int16
    @NSManaged public var type: String

Home() 视图中,我想按类型分组,然后找到每种类型中所有对象的总支付金额(即成本总和)。

到目前为止,我已经尝试制作一个特殊的 group() 函数(有点像 this question 中的),但收到错误消息 “在范围内找不到 'i'”

struct Home: View 
    
    @Environment(\.managedObjectContext) private var viewContext
    
    @FetchRequest(entity: Items.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Items.type, ascending: true)]) var items: FetchedResults<Items>

var body: some View 
        ForEach(group(items), id: \.self)  [i] in
            Text("\([i].cost.reduce(0,+))")
           
      


func group(_ result : FetchedResults<Items>)-> [[Items]] 
        
    return Dictionary(grouping: result)  $0.type 
            .sorted(by: $0.key < $1.key)
            .map $0.value
        
    

这肯定不会这么难吧?非常欢迎任何帮助!

【问题讨论】:

[i] in 中的i 不应有方括号。像这样的括号 capture 一个值,但你没有要捕获的变量——你只是得到一个闭包的参数。下一行也一样——那里也没有括号。可能还有其他问题——最好能看到Clothing的源代码 谢谢,我希望这是答案,但是当我尝试时,我收到消息 “类型 '[Items]' 的值没有成员 'cost'”Clothing 也应该改为 Items(抱歉,这是一个错误,我在问题中更正了它)。 是的,就像我说的,可能还有其他问题。你从group 返回一个多维数组,所以你必须先解开它。也许你的意思是i.map $0.cost .reduce(0,+) 很好,这很完美!如果您愿意,请随时将此作为答案提交:-) 非常感谢。 【参考方案1】:

您不应该在 [i] in 中的 i 周围加上括号。这样的括号捕获一个值,但您没有要捕获的变量——您只是获取闭包的参数。

ForEach(group(items), id: \.self)  i in

在您的下一行,您正在处理一个多维数组。你不能直接访问属性,但你可以先map

Text("\(i.map(\.cost).reduce(0,+))")

您也可以稍微改变结构并删除地图:

i.reduce(0, $0 + $1.cost )

【讨论】:

以上是关于SwiftUI:按核心数据属性分组和求和的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中汇总过滤的核心数据?

核心数据:按实体属性对实体进行分组

按名称分组的核心数据获取属性

在 Swift 中过滤对象数组并求和它们的属性

将核心数据从 Swift 迁移到 SwiftUI

熊猫数据框分组和求和,组内,跨行值而不是按列