Ich bin mit Coredata schnellen Testen und ich erstellt den folgenden Code:executeFetchRequest throw fatalen Fehler: NSArray Element konnte das Swift Array Elementtyp entsprechen
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 laufen:
Contact.execute()
dann werfen die Compiler diesen Fehler:
fatal error: NSArray element failed to match the Swift Array Element type
wenn ich versuche, Werte von Array zu erhalten:
let firstContact = result[0] as Contact
Ich denke, das Problem ist in executeFetchRequest
. Unter Objective-c ist der Rückgabetyp executeFetchRequest
ein NSArray
. Jetzt auf Swift der Rückgabetyp ist ein [AnyObject]?
.
Ich versuchte, das [AnyObject]?
Ergebnis NSArray
zu werfen, 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
Update:
-----------
Wenn Ich bekomme executeFetchRequest
Ergebnis als ein optionales Array und verwenden Sie [NSManagedObject]
anstelle von [Contact]
es funktioniert.
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 Instanzen Entität nicht geladen werden hat Ihre NSManagedObject Klasse. Es gibt verschiedene Gründe, warum dies der Fall ist. Alle konzentrieren sich auf "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 zu spezifizieren
- Sie falsch geschriebene Namen
In meinem Fall wurde ich vergessen, die Klasse zu spezifizieren wie POB in ihrer Antwort zeigt.
den Klassennamen als Entity-Name und Modul als 'Current Product Module' gesetzt Warum Sie den '-execute gesetzt hat:' Methode, führt ein 'NSFetchRequest' in Ihrer 'NSManagedObject'-Unterklasse? –
Ich habe es aus Gründen der Einfachheit gemacht. Eine einfache Möglichkeit, das Problem hier zu zeigen. – Sebastian
Haben Sie versucht, mit 'lassen Kontakt = NSEntityDescription.insertNewObjectForEntityForName ("Contact", inManagedObjectContext: Kontext) als Contact' statt' lassen contact = Kontakt (Einheit: entityDescripition !, insertIntoManagedObjectContext: context) '? –