Search code examples
swiftcocoansfetchedresultscontroller

Why can't I create a Fetched Results Controller using a closure?


I am trying to create a Fetched Results Controller following some tutorials. However in Swift 3 I get the error 'unable to infer complex closure type' when attempting to create one in the pattern you see below.

class FriendsController: UICollectionViewController {

lazy var fetchedResultsController: NSFetchedResultsController = {
    let context = (UIApplication.shared.delegate as! 
AppDelegate).persistentContainer.viewContext

    let fetchRequest: NSFetchRequest = Friend.fetchRequest()

    let fetchedResultsController = 
NSFetchedResultsController(fetchRequest: fetchRequest, 
managedObjectContext: context, sectionNameKeyPath: nil, cacheName: 
nil)
    return fetchedResultsController
}()

I use this closure pattern when making other things such as views, buttons etc, however it doesn't work (even when I don't use lazy var). The error also isn't very clear to me either (stated above). Thank you.


Solution

  • Because you should specify the generic type of the objects your FetchedResultsControllers holds

    lazy var fetchedResultsController: NSFetchedResultsController<Friend> = {
    
        let context = //your context
    
        let req = // your request
    
        let fetchedResultsController = NSFetchedResultsController(fetchRequest: req, managedObjectContext:context, sectionNameKeyPath: nil, cacheName: nil)
        fetchedResultsController.delegate = self
    
        do {
            try fetchedResultsController.performFetch()
    
        }
        catch {
            print("fetch error \(error)")
        }
        return fetchedResultsController
    }()