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:按核心数据属性分组和求和的主要内容,如果未能解决你的问题,请参考以下文章