executeFetchRequest Schwerwiegender Fehler: NSArray-Element konnte nicht mit dem Swift Array-Elementtyp übereinstimmen
Ich teste schnell mit CoreData und habe den folgenden Code erstellt:
import UIKit
import CoreData
class Contact: NSManagedObject {
@NSManaged var name: String
@NSManaged var email: String
class func execute(){
let appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
let context:NSManagedObjectContext = appDel.managedObjectContext!
let entityDescripition = NSEntityDescription.entityForName("Contact", inManagedObjectContext: context)
let contact = Contact(entity: entityDescripition!, insertIntoManagedObjectContext: context)
contact.name = "john Apleesee"
contact.email = "[email protected]"
context.save(nil)
let fetch:NSFetchRequest = NSFetchRequest(entityName: "Contact")
var result = context.executeFetchRequest(fetch, error: nil) as [Contact]
let firstContact = result[0] as Contact // <<-- error !
println("\(firstContact.name)")
println("\(firstContact.email)")
}
}
Wenn ich laufe:
Contact.execute()
Dann wirft der Compiler diesen Fehler:
fatal error: NSArray element failed to match the Swift Array Element type
wenn ich versuche, Werte aus dem Array abzurufen:
let firstContact = result[0] as Contact
Ich denke, das Problem liegt inexecuteFetchRequest
. AufZiel der Rückgabetyp vonexecuteFetchRequest
ist einNSArray
. Jetzt aufSchnel der Rückgabetyp ist ein[AnyObject]?
.
Ich habe versucht, das @ zu besetz[AnyObject]?
Ergebnis zuNSArray
, aber Xcode sagte:
Cannot convert the expression's type '[AnyObject]?' to type 'NSArray'
Was mache ich falsch?
Ich verwende: Xcode 6.0 (6A313) GM und OSX 10.9.4
Aktualisieren
-----------
Wenn ich @ bekomexecuteFetchRequest
result als optionales Array und benutze[NSManagedObject]
anstatt[Contact]
Es klappt
if let result: [NSManagedObject]? = context.executeFetchRequest(fetch, error: nil) as? [NSManagedObject] {
let firstContact: NSManagedObject = result![0]
let name = firstContact.valueForKey("name") as String
let email = firstContact.valueForKey("email") as String
println("\(name)")
println("\(email)")
}
Update2:
-----------
Diese Art von Problem tritt auf, wenn Entitätsinstanzen nicht mit Ihrer NSManagedObject-Klasse geladen wurden. Es gibt verschiedene Gründe, warum dies so ist. Im Fokus steht "Core Data konnte die Klasse, die Sie für diese Entität in der Klassenzeile im Datenmodell angegeben haben, nicht finden."
Unter den Möglichkeiten:
- Sie haben das falsche Paket für Ihre Swift-Klasse angegeben
- Sie haben vergessen, die Klasse @ anzugeb
- Sie haben den Namen @ falsch geschrieb
In meinem Fall habe ich vergessen, die Klasse anzugeben, wie POB in ihrer Antwort zeigt.