Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将核心数据管理对象数组转换为;“可识别”;名单,用swift?(代码11,测试版5)_Swift_Swiftui_Xcode11_Ios13 - Fatal编程技术网

如何将核心数据管理对象数组转换为;“可识别”;名单,用swift?(代码11,测试版5)

如何将核心数据管理对象数组转换为;“可识别”;名单,用swift?(代码11,测试版5),swift,swiftui,xcode11,ios13,Swift,Swiftui,Xcode11,Ios13,如何将使用Swift/IOS通过“fetchRequest”从核心数据检索的托管对象数组传输到“可识别”的数组 示例-如何使“任务”数组“可识别” let fetchRequest:NSFetchRequest=Todo.fetchRequest() let tasks=try context?.fetch(fetchRequest) 背景: 在使用“列表”的SwiftUI中,传递给列表的数据数组需要是“可识别的” 我还注意到(由:.self标识的)似乎已被弃用 使用(Xcode 11,Be

如何将使用Swift/IOS通过“fetchRequest”从核心数据检索的托管对象数组传输到“可识别”的数组

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

let fetchRequest:NSFetchRequest=Todo.fetchRequest()
let tasks=try context?.fetch(fetchRequest)
背景:

  • 在使用“列表”的SwiftUI中,传递给列表的数据数组需要是“可识别的”
  • 我还注意到(由:.self标识的)似乎已被弃用
  • 使用(Xcode 11,Beta 5)
  • 目前正在使用xcode为核心数据实体自动创建托管对象,因此最好坚持使用这种方法
使用替换
ForEach(数据,id:\.idAttribute)
用新语法替换了(由:.self)标识的功能

ForEach(filteredGrapes, id: \.id) { grape in
    GrapeCell(grape: grape)
}
Coredata示例: 使用名为
ItemStore.xcdatamodeld
的文件,其中实体
ItemDAO
定义为启用了
Generation=Class Definition
,并具有名为
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")
        }
    }
}
通过扩展添加可识别的 手动维护CoreData模型以添加可识别的


在那里,您可以像往常一样添加可识别的
,这是不必要的,因为扩展也可以添加可识别的。

我刚刚用一个核心数据实体尝试了这个概念,它只有一个属性“title”,一个字符串,所以我有“id:\.title”,但是我随后得到一个生成错误:“type'.'没有成员“title”。(问题行:“ForEach(todoStore.getTodoItems(),id:\.title){item in”)@Greg添加了一个示例。您可能需要重新启动Xcode才能找到密钥路径,这听起来像是一个bug。您只是尝试了一下,但没有任何帮助-几乎就好像它无法从自动生成的文件中提取“title”属性一样(在我的Xcode项目中我无法这样做)Todo从我的核心数据模型创建的托管对象…(?)得到了它-我改为手动创建托管子类,并在这里看到xcode将“title”属性设置为可选,尽管在coredata designer中它不是…它现在选择了“title”属性okGood现在可以正常工作了。我认为它更像是一个Xcode错误,因为我必须清除构建文件夹,然后重新启动Xcode,它才能正确地选择关键路径。这样类定义生成对我来说也很有效。
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!
    }
}