来自过滤后的提取请求的 Sum Double?
Sum Double from filtered fetch request?
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) { [=10=] + .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 存储为 double。我能够通过 init 进行过滤以获取今天值的获取请求,但我无法以不会导致错误的方式对属性求和。像上面一样,任何在视图中求和的尝试都会导致
类型“()”不符合 'AccessibilityRotorContent'。 -要么-
类型“()”不符合“视图”
到目前为止,没有任何 Whosebug 解决方案适用于我在必须按另一个属性过滤时对核心数据中的属性求和的情况。
在您的代码中,您将视图定义为...
var body: some View {
ForEach(value, id: \.self) { value in
total = value.reduce(0) { [=10=] + .feedquant }
}
}
您没有在 ForEach
中定义 View
,因此它不知道如何呈现视图。
ForEach
用于使用给定数组创建多个视图。它不用于像 forEach
那样迭代数组 Swift.
此外...您传递给这个的 value
是什么?
您将能够显示总计...
var body: some View {
Text("\(someArray.reduce(0) { [=11=] + .feedquant })")
}
但我不完全确定你的代码在做什么,所以我不确定你的数据结构是什么。
看来你上面的代码写错了。在您的 ForEach
中,您有一个变量 value
,它必须是一个集合(我假设您的 FetchRequest
的结果),但它没有在任何地方定义。为了这个答案,我假设第一次使用 value
实际上应该是 singer
.
@Fogmeister 关于您遇到的错误消息问题是正确的。您必须有一个 View
而您的代码没有提供。但是,您在尝试使用 reduce()
时仍然遇到另一个更深层次的问题
您在使用 reduce()
时遇到的问题是您设置 CoreData
模型的方式。您有一个名为 FeedList
的 Entity
,它具有 date
和 feedquant
.
的属性
当您进入 ForEach
时,singer
是一个集合,但 value
是一个单独的托管对象,它只是一个 String
和一个 Double
,但你必须在集合上使用 reduce
,而不是 Double
。
您需要重新考虑 CoreData
实施。就个人而言,我会有两个具有关系的实体。第一个是 Date
,第二个是 FeedQuant
。 FeedQuant
会有一个属性 value
,这是一个 Double
。然后我会在 Date
和 Feedquant
之间建立一对多的关系。从 Date
我将其称为 hasFeedquant
,反之则为 hasDate
.
你的 FetchRequest
将保持不变,除了实体将是一个 Date
实体,但现在你会得到一个关系 hasFeedquant
这是一个集合,然后你可以使用减少那个。
您的代码将是:
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) { [=10=] + .value)") }
}
}
init(filter: String) {
fetchRequest = FetchRequest<Date>(
entity: FeedList.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Date.compdate, ascending: false)],
predicate: NSPredicate(format: "compdate == %@", filter)
)
}
} //: View
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) { [=10=] + .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 存储为 double。我能够通过 init 进行过滤以获取今天值的获取请求,但我无法以不会导致错误的方式对属性求和。像上面一样,任何在视图中求和的尝试都会导致
类型“()”不符合 'AccessibilityRotorContent'。 -要么- 类型“()”不符合“视图”
到目前为止,没有任何 Whosebug 解决方案适用于我在必须按另一个属性过滤时对核心数据中的属性求和的情况。
在您的代码中,您将视图定义为...
var body: some View {
ForEach(value, id: \.self) { value in
total = value.reduce(0) { [=10=] + .feedquant }
}
}
您没有在 ForEach
中定义 View
,因此它不知道如何呈现视图。
ForEach
用于使用给定数组创建多个视图。它不用于像 forEach
那样迭代数组 Swift.
此外...您传递给这个的 value
是什么?
您将能够显示总计...
var body: some View {
Text("\(someArray.reduce(0) { [=11=] + .feedquant })")
}
但我不完全确定你的代码在做什么,所以我不确定你的数据结构是什么。
看来你上面的代码写错了。在您的 ForEach
中,您有一个变量 value
,它必须是一个集合(我假设您的 FetchRequest
的结果),但它没有在任何地方定义。为了这个答案,我假设第一次使用 value
实际上应该是 singer
.
@Fogmeister 关于您遇到的错误消息问题是正确的。您必须有一个 View
而您的代码没有提供。但是,您在尝试使用 reduce()
您在使用 reduce()
时遇到的问题是您设置 CoreData
模型的方式。您有一个名为 FeedList
的 Entity
,它具有 date
和 feedquant
.
当您进入 ForEach
时,singer
是一个集合,但 value
是一个单独的托管对象,它只是一个 String
和一个 Double
,但你必须在集合上使用 reduce
,而不是 Double
。
您需要重新考虑 CoreData
实施。就个人而言,我会有两个具有关系的实体。第一个是 Date
,第二个是 FeedQuant
。 FeedQuant
会有一个属性 value
,这是一个 Double
。然后我会在 Date
和 Feedquant
之间建立一对多的关系。从 Date
我将其称为 hasFeedquant
,反之则为 hasDate
.
你的 FetchRequest
将保持不变,除了实体将是一个 Date
实体,但现在你会得到一个关系 hasFeedquant
这是一个集合,然后你可以使用减少那个。
您的代码将是:
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) { [=10=] + .value)") }
}
}
init(filter: String) {
fetchRequest = FetchRequest<Date>(
entity: FeedList.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Date.compdate, ascending: false)],
predicate: NSPredicate(format: "compdate == %@", filter)
)
}
} //: View