【问题标题】:Sum Double from filtered fetch request?从过滤的提取请求中求和双倍?
【发布时间】:2021-09-27 10:20:46
【问题描述】:
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”。 -或者- 类型 '()' 不符合 'View'

到目前为止,对于我在必须按另一个属性进行过滤时对核心数据中的属性求和的情况,没有任何 stackoverflow 解决方案有效。

【问题讨论】:

    标签: core-data swiftui nsfetchrequest


    【解决方案1】:

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

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

    时,您仍然会遇到另一个更深层次的问题

    您在使用reduce() 时遇到的问题是您设置CoreData 模型的方式。您有一个名为FeedListEntity,其属性为datefeedquant

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

    您需要重新考虑您的 CoreData 实施。就个人而言,我将有两个具有关系的实体。第一个是Date,第二个是FeedQuantFeedQuant 将有一个属性value,它是一个Double。然后我会在DateFeedquant 之间建立一对多的关系。从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
    

    【讨论】:

    • 我以这种方式设置并运行代码,然后出现一个新错误,提示“'Double' 类型的值没有成员'reduce'
    • 如果你有Double,那么你就建立了一对一的关系,而不是一对多的关系。见One-to-many relationships with Core Data, SwiftUI, and @FetchRequest。你需要有一个Collection 类型才能使用.reduce
    【解决方案2】:

    在您的代码中,您的视图定义如下...

    var body: some View {            
      ForEach(value, id: \.self) { value in
        total = value.reduce(0) { $0 + $1.feedquant }
      }
    }
    

    您没有在ForEach 中定义View,因此它不知道如何呈现视图。

    ForEach 用于创建具有给定数组的多个视图。它不用于迭代像 forEach 这样在 Swift 中的数组。

    另外...您传递给此的value 是什么?

    您将能够显示总喜欢...

    var body: some View {            
      Text("\(someArray.reduce(0) { $0 + $1.feedquant })")
    }
    

    但我不完全确定你的代码在做什么,所以我不确定你的数据结构是什么。

    【讨论】:

      猜你喜欢
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多