Тип неизвестен для Data.Element в SwiftUI ForEach с использованием Core Data - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь использовать Generics для извлечения всех элементов в сущности Core Data. Все хорошо, за исключением случаев, когда внутри ForEach l oop.

Тип неизвестен

в ContentView, я хочу сделать что-то вроде

FilteredList<Singer>(filterKey: "lastName", filterValue: lastNameFilter)

FilteredList<Baker>(filterKey: "lastName", filterValue: lastNameFilter)

FilteredList<Painter>(filterKey: "lastName", filterValue: lastNameFilter)    

FilteredList<Friends>(filterKey: "lastName", filterValue: lastNameFilter)

здесь есть ошибка

enter image description here

Я могу исправить это (сущность как! Певица)

enter image description here

, но я теряю силу Дженериков

Этот код, которому я следую, и он от Пола Динамическая фильтрация @FetchRequest с SwiftUI

и вот код ...

import SwiftUI
import CoreData

struct FilteredList<T: NSManagedObject, Content: View>: View {

  @Environment(\.managedObjectContext) var moc

  var fetchRequest: FetchRequest<T>

  var entityItems: FetchedResults<T> { fetchRequest.wrappedValue }

  // this is our content closure; we'll call this once for each item in the list
  let content: (T) -> Content

  init(filterKey: String,
       filterValue: String,
       @ViewBuilder content: @escaping (T) -> Content) {

    fetchRequest =
      FetchRequest<T>(
        entity: T.entity(),
        sortDescriptors: [],
        predicate: NSPredicate(format: "%K BEGINSWITH %@", filterKey, filterValue))

    self.content = content
  }//init

  var body: some View {
    List {
      ForEach(fetchRequest.wrappedValue, id: \.self) { entity in
        //self.content(entity)
        Text("Hello, World! \((entity as! Singer).wrappedFirstName)")
      }//ForEach
        .onDelete(perform: removeAccount)
    }//List
  }//body

  func removeAccount(at offsets: IndexSet) {
    for index in offsets {
      let oneEntity = entityItems[index]
      moc.delete(oneEntity)
    }//for
    try? moc.save()
  }//removeTransaction
}//FilteredList

struct FilteredList_Previews: PreviewProvider {
  static var previews: some View {
    FilteredList(filterKey: "lastName", filterValue: "A") { (entity: Singer) in
      Text("Hello, World! \(entity.wrappedFirstName)")
    }//FilteredList
  }//previews
}//FilteredList_Previews

1 Ответ

1 голос
/ 08 февраля 2020

Вы можете попробовать Singer, Painter, Baker и Friend типа Protocol.

extension Singer: PersonProtocol{

}
extension Painter: PersonProtocol{

}
...
protocol PersonProtocol {
    var wrappedFirstName: String? {get set}
    var wrappedLastName: String? {get set}
    ...
}

Таким образом, когда вы доберетесь до ForEach метод, который вы можете развернуть от entity до PersonProtocol

    Text("Hello, World! \((entity as! PersonProtocol).wrappedFirstName)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...