首页 > 解决方案 > 如何在核心数据结果上运行一个简单的函数

问题描述

抱歉,如果这是一个非常基本的问题,我只是在学习如何使用 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
}()

标签: core-dataswiftui

解决方案


这是因为项目(又名 FetchedResults)是一个项目数组。所以它可以包含多个返回的项目。

ForEach 正在工作,因为 ForEach 本质上会遍历数组并显示每个数组。

如果您只想显示项目数,请删除“时间戳”部分:

Text("\(items.count)")

如果您想显示时间戳,那么您需要指定要显示时间戳的数组中的哪个项目。因此要显示数组中第一项的时间戳,您可以执行以下操作:

 Text("\(items[0].timestamp ?? Date())")

(请注意,如果数据库中没有项目,那么您将获得今天的日期。此外,使用列表和 ForEach 更常见,它将显示列表中的所有记录,包括时间戳(就像您在 Apple 的其余样板代码中所拥有的一样) )


推荐阅读