Я пытаюсь использовать 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)
здесь есть ошибка
Я могу исправить это (сущность как! Певица)
, но я теряю силу Дженериков
Этот код, которому я следую, и он от Пола Динамическая фильтрация @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