如何迅速将核心数据管理对象数组转换为“可识别”列表?(Xcode 11,Beta 5)

格雷格

如何将使用Swift / IOS通过“ fetchRequest”从“核心数据”中检索到的管理对象数组转移到“可识别”数组中?

示例-如何使“任务”数组“可识别”

let fetchRequest : NSFetchRequest<Todo> = Todo.fetchRequest()
let tasks = try context?.fetch(fetchRequest)

背景:

  • 在使用“列表”的SwiftUI中,传递给列表的数据数组必须“可识别”。
  • 我还注意到,标识(通过:.self)似乎已被弃用。
  • 使用(Xcode 11,Beta 5)
  • 当前使用xcode为核心数据实体自动创建托管对象,因此坚持使用此方法会很好
法比安

使用替换 ForEach(Data, id: \.idAttribute)

该功能identified(by: .self)已被新语法替换:

ForEach(filteredGrapes, id: \.id) { grape in
    GrapeCell(grape: grape)
}

Coredata示例:

使用名称为的文件ItemStore.xcdatamodeld,该文件的实体ItemDAO定义为Generation=Class Definitionenabled,并且具有名为的字符串属性title

注意:必须先Product/Clear Build Folder重启Xcode才能使Xcode11Beta5找到正确的密钥路径,这似乎是Xcode11Beta5中的错误。

import Foundation
import SwiftUI
import CoreData

class MyItemStore {
    public static func defaultItems() -> [ItemDAO]{
        let store = NSPersistentContainer(name: "ItemStore")
        store.loadPersistentStores { (desc, err) in
            if let err = err {
                fatalError("core data error: \(err)")
            }
        }
        let context = store.viewContext
        let item = ItemDAO(context: context)
        item.title = "hello you"
        try! context.save()
        return [
            item,
            item,
        ]
    }
}

struct CoreDataView: View {
    let items: [ItemDAO] = MyItemStore.defaultItems()

    var body: some View {
        VStack{
            ForEach(items, id: \.title) { (item: ItemDAO) in
                Text(item.title ?? "no title")
            }
            Text("hi")
        }
    }
}

通过扩展添加可识别

extension Todo: Identifiable {
    public var id: String {
        //return self.objectID.uriRepresentation().absoluteString
        return self.title!
    }
}

手动维护CoreData模型以添加 Identifiable

您可以Identifiable像往常一样在此添加,尽管扩展也可以添加Identifiable,但这不是必需的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章