Вопрос:

Как преобразовать массив управляемых объектов основных данных в «идентифицируемый» список, в Swift? (XCode 11, бета 5)

swift swiftui xcode11 ios13

54 просмотра

1 ответ

14292 Репутация автора

Как можно передать массив управляемых объектов, извлеченных из Core Data с помощью Swift / IOS через «fetchRequest», в массив, который «идентифицируем»?

Пример - Как сделать массив «tasks» «идентифицируемым»

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

Фон:

  • В SwiftUI, использующем «Список», массив данных, передаваемых в Список, должен быть «идентифицируемым».
  • Я также отмечаю, что идентифицированное (автором: .self) кажется устаревшим.
  • Использование (XCode 11, Beta 5)
  • В настоящее время используется автоматическое создание xcode управляемых объектов для основных объектов данных, поэтому было бы неплохо придерживаться этого подхода.
Автор: Greg Источник Размещён: 08.08.2019 04:58

Ответы (1)


2 плюса

1486 Репутация автора

Решение

Используйте замену ForEach(Data, id: \.idAttribute)

Функция identified(by: .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")
        }
    }
}

Добавление идентифицируемого через расширение

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

Ведение моделей CoreData вручную для добавления Identifiable

Там вы можете добавить Identifiableкак обычно, но в этом нет необходимости, так как расширение также может добавить Identifiable.

Автор: Fabian Размещён: 08.08.2019 06:53
Вопросы из категории :
32x32