如何将核心数据管理对象数组转换为;“可识别”;名单,用swift?(代码11,测试版5)
如何将使用Swift/IOS通过“fetchRequest”从核心数据检索的托管对象数组传输到“可识别”的数组 示例-如何使“任务”数组“可识别”如何将核心数据管理对象数组转换为;“可识别”;名单,用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
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!
}
}