core-data - 如何在核心数据结果上运行一个简单的函数
问题描述
抱歉,如果这是一个非常基本的问题,我只是在学习如何使用 Core Data。
我正在尝试对Text("\(items.timestamp.count)")
Apple 默认为您提供的数据(只有一个属性的项目列表:)运行一个简单的函数 ( timestamp
)。但是,我不断收到错误"Value of type 'FetchedResults' has no member 'timestamp"。
谁能解释为什么会这样?当在Apple 自动提供timestamp
的循环中访问该属性时ForEach
,一切似乎都正常。
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
animation: .default)
private var items: FetchedResults<Item>
var body: some View {
Text("\(items.timestamp.count)")
List {
ForEach(items) { item in
Text("Item at \(item.timestamp!, formatter: itemFormatter)")
}
}
}
}
private let itemFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.timeStyle = .medium
return formatter
}()
解决方案
这是因为项目(又名 FetchedResults)是一个项目数组。所以它可以包含多个返回的项目。
ForEach 正在工作,因为 ForEach 本质上会遍历数组并显示每个数组。
如果您只想显示项目数,请删除“时间戳”部分:
Text("\(items.count)")
如果您想显示时间戳,那么您需要指定要显示时间戳的数组中的哪个项目。因此要显示数组中第一项的时间戳,您可以执行以下操作:
Text("\(items[0].timestamp ?? Date())")
(请注意,如果数据库中没有项目,那么您将获得今天的日期。此外,使用列表和 ForEach 更常见,它将显示列表中的所有记录,包括时间戳(就像您在 Apple 的其余样板代码中所拥有的一样) )
推荐阅读
- c# - 将 C# 中的 JSON 反序列化为 API 对象
- r - 从 excel 到 R 时,从数字的开头删除一个 0。我如何防止这种情况发生?
- swift - 如何获得 Apple 表情符号名称而不是 Unicode 名称?
- google-apps-script - 通过服务帐户设置 Gmail 委托时出现权限不足错误
- reactjs - 不变式失败:您不应该在外部使用
- c# - 如何在自定义 ValidationAttribute 中将 Guid 用作属性构造函数值或对象
- javascript - 如何扩展或重新定义或覆盖 jquery 内置方法/函数,如 jQuery.fn.html()?
- python - Selenium - 使用 element.click() 时出现过时元素引用异常
- javascript - Next.js 是否需要运行节点服务器?
- c# - 如何为 ControlPaint.DrawButton() 添加点击事件和图像