如何在 swift 中将核心数据托管对象数组转换为"identifiable"列表?(Xcode 11,Beta 5)



如何将使用 Swift/IOS 通过"fetchRequest"从 Core Data 检索到的托管对象数组转移到"可识别"的数组中?

示例 - 如何使"任务"数组"可识别">

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

背景:

  • 在使用"列表"的 SwiftUI 中,传递给列表的数据数组需要是"可识别的"。
  • 我还注意到已识别的(由:.self(似乎已被弃用。
  • 使用(Xcode 11,测试版 5(
  • 目前使用 xcode 为核心数据实体自动创建托管对象,因此坚持使用这种方法会很好

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

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

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

核心数据示例:

使用名为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")
}
}
}

通过扩展添加可识别

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

手动维护 CoreData 模型以添加Identifiable

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

相关内容

  • 没有找到相关文章

最新更新