首页 > 解决方案 > 从过滤的提取请求中求和双倍?

问题描述

import SwiftUI
import Foundation
import CoreData

struct FilteredList: View {
    var fetchRequest: FetchRequest<FeedList>
    var value: FetchedResults<FeedList> {
        fetchRequest.wrappedValue
    }
    var total: Double = 0.0
    
    
    var body: some View {
        ForEach(value, id: \.self) {value in
            Text("Feed quantity is: \(value.feedquant.reduce(0) { $0 + $1.value}) ")
        }
    }
    
    init(filter: String) {
        fetchRequest = FetchRequest<FeedList>(entity:
           FeedList.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \FeedList.compdate, ascending: false)],
         predicate: NSPredicate(format: "compdate == %@", filter))
        
    }
    
}//: View

我的 CoreData 中有两个属性。Compdate 存储为日期字符串,feedquant 存储为双精度值。我能够过滤以通过 init 获取今天值的获取请求,但我无法以不会导致错误的方式对属性求和。像上面一样,在视图中求和的任何尝试都会导致

类型“()”不能符合“AccessibilityRotorContent”。- 或 - 类型“()”不符合“视图”

到目前为止,当我不得不通过另一个属性过滤时,没有任何 stackoverflow 解决方案适用于我在核心数据中对一个属性求和的情况。

标签: core-dataswiftuinsfetchrequest

解决方案


您似乎错误地编写了上面的代码。在您的ForEach中,您有一个变量value,它必须是一个集合(我假设您的结果FetchRequest),但它没有在任何地方定义。为了这个答案,我假设第一次使用的value实际上应该是singer.

@Fogmeister 对于您在错误消息方面遇到的问题是正确的。你必须有一个View并且你的代码没有提供一个。但是,在尝试使用时,您仍然遇到另一个更深层次的问题reduce()

您使用的问题reduce()是您CoreData设置模型的方式。您有一个具有和属性的Entity权利。FeedListdatefeedquant

当你进入你的ForEach,singer是一个集合,但value它是一个单独的托管对象,它只是 aString和 a Double,但你必须reduce在一个集合上使用,而不是 a Double

您需要重新考虑您的CoreData实施。就个人而言,我将有两个具有关系的实体。第一个是Date,第二个是FeedQuantFeedQuant会有一个属性valueDouble. Date然后我会在和之间建立一对多的关系Feedquant。从Date我称之为hasFeedquant,反之亦然hasDate

除了实体是实体之外,您FetchRequest将保持不变Date,但现在您将获得hasFeedquant一个集合关系,然后您可以对其使用 reduce。

您的代码将是:

struct FilteredList: View {
  var fetchRequest: FetchRequest<FeedList>
  var feedDate: FetchedResults<Date> {
    fetchRequest.wrappedValue
  }
  var total: Double = 0.0
        
  var body: some View {            
    ForEach(feedDate, id: \.self) {value in
      // value.hasFeedquant is a Set<Feedquant> and so is reducible
      Text("Feed quantity is: \(value.hasFeedquant.reduce(0) { $0 + $1.value)") }
    }
  }
        
  init(filter: String) {
    fetchRequest = FetchRequest<Date>(
      entity: FeedList.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Date.compdate, ascending: false)],
      predicate: NSPredicate(format: "compdate == %@", filter)
    )        
  }
} //: View

推荐阅读