I have followed this tutorial to learn about dynamic filters and CoreData: https://www.hackingwithswift.com/quick-start/ios-swiftui/dynamically-filtering-fetchrequest-with-swiftui
I have the following code. ContentView.swift:
import SwiftUI
struct ContentView: View {
@Environment(\.managedObjectContext) var moc
@State var lastNameFilter = "A"
var body: some View {
VStack {
FilteredList(filter: lastNameFilter)
Button("Add Examples") {
let taylor = Singer(context: self.moc)
taylor.firstName = "Taylor"
taylor.lastName = "Swift"
let ed = Singer(context: self.moc)
ed.firstName = "Ed"
ed.lastName = "Sheeran"
let adele = Singer(context: self.moc)
adele.firstName = "Adele"
adele.lastName = "Adkins"
try? self.moc.save()
}
Button("Show A") {
self.lastNameFilter = "A"
}
Button("Show S") {
self.lastNameFilter = "S"
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
FilteredList.swift:
import CoreData
import SwiftUI
struct FilteredList: View {
var fetchRequest: FetchRequest<Singer>
var singers: FetchedResults<Singer> { fetchRequest.wrappedValue }
var body: some View {
List(singers, id: \.self) { singer in
Text("\(singer.wrappedFirstName) \(singer.wrappedLastName)")
}
}
init(filter: String) {
fetchRequest = FetchRequest<Singer>(entity: Singer.entity(), sortDescriptors: [], predicate: NSPredicate(format: "lastName BEGINSWITH %@", filter))
}
}
//struct FilteredList_Previews: PreviewProvider {
// static var previews: some View {
// }
//}
Singer+CoreDataClass.swift:
import Foundation
import CoreData
@objc(Singer)
public class Singer: NSManagedObject {
}
Singer+CoreDataProperties.swift:
import Foundation
import CoreData
extension Singer {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Singer> {
return NSFetchRequest<Singer>(entityName: "Singer")
}
@NSManaged public var firstName: String?
@NSManaged public var lastName: String?
var wrappedFirstName : String {
firstName ?? "Unknown"
}
var wrappedLastName : String {
lastName ?? "Unknown"
}
}
Core Data has 1 entity: Singer with 2 String attributes: firstName and lastName. Module: Current Product Module. Codegen: Manual/None.
When I try to preview ContentView, preview crashes. When I open crash logs file and go to Debug Navigator, I can see following error:
Dispatch queue: com.apple.main-thread (0)
On lines:
FilteredList.swift:
var singers: FetchedResults<Singer> { fetchRequest.wrappedValue }
List(singers, id: \.self) { singer in
AppDelegate.swift:
class AppDelegate: UIResponder, UIApplicationDelegate {
What can be the problem? wrappedValue? What is wrong with the code?
EDIT: Here is a link to crash log file on my Dropbox: crash-logs