5

I want to do a NSFetchRequest to display my data into a UICollectionView :

import UIKit
import CoreData

let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let context: NSManagedObjectContext = appDelegate.managedObjectContext
class GarageViewController: UIViewController, UICollectionViewDelegate,UICollectionViewDataSource {

@IBOutlet weak var backgroundView: UIImageView!

@IBOutlet weak var collectionView: UICollectionView!

var voitures: [Voiture]  = [Voiture]()

override func viewDidLoad() {
    super.viewDidLoad()

    collectionView.reloadData()

    let fetchRequest = NSFetchRequest(entityName: "Voiture")
    fetchRequest.resultType = .DictionaryResultType

    do {
        try voitures = context.executeFetchRequest(fetchRequest) as! [Voiture]
    }
    catch let fetchError as NSError {
        print("VoitureFetch error: \(fetchError.localizedDescription)")
    }

    if (voitures.count > 0) {
        for voiture in voitures as [Voiture] {

            print(voiture.nom!)

        }
    }
    else {
        print("Aucune voiture")
    }

}

When I run the code I get that error :

fatal error: NSArray element failed to match the Swift Array Element type

Thank's for your help !

Antonio
  • 135
  • 1
  • 12
  • 2
    What is in the array returned by the fetch request. It isn't `Voiture` objects. It is probably `NSManagedObject` instances. – Paulw11 Jul 08 '15 at 22:10
  • 1
    You can answer your own question (instead of posting Solution in your question), makes things easier for people stumbling on this in the future. – sbarow Jul 17 '15 at 09:15
  • 1
    Ok thank you sbarow. – Antonio Jul 18 '15 at 11:31

2 Answers2

14

I had the same problem. The issue was due to not setting the class property for the entity in model file.

enter image description here

muneeb
  • 2,461
  • 1
  • 13
  • 9
  • 1
    Cool thanks for pointing this out. Also needed this post http://stackoverflow.com/questions/26613971/coredata-warning-unable-to-load-class-named to get it working for me. I had to include @objc(ClassName) – Dave Thomas Oct 02 '15 at 22:15
  • In Addition to this, after setting the class name, set the module name to "Current Product Module". – Akshar Patel Mar 15 '16 at 09:41
3

Solution

var voitures: [NSManagedObject]?  = [NSManagedObject]()


if (voitures!.count > 0) {

        let voiture: NSManagedObject = voitures![indexPath.row]

        print((voiture.valueForKey("nom") as? String))
    }
Antonio
  • 135
  • 1
  • 12