executeFetchRequest - erreur fatale: l'élément NSArray n'a pas pu correspondre au type de l'élément Swift Array
Je suis en essais swift avec CoreData et j'ai créé le code suivant:
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)")
}
}
Quand je le lance:
Contact.execute()
Puis le compilateur affiche cette erreur:
fatal error: NSArray element failed to match the Swift Array Element type
lorsque j'essaie d'obtenir les valeurs de la matrice:
let firstContact = result[0] as Contact
Je crois que le problème est dans executeFetchRequest
. Sur Objective-c le type de retour de executeFetchRequest
est un NSArray
. Maintenant sur Swift le type de retour est un [AnyObject]?
.
J'ai essayé de lancer le [AnyObject]?
résultat à NSArray
mais Xcode dit:
Cannot convert the expression's type '[AnyObject]?' to type 'NSArray'
Ce que je fais mal ?
Je suis en utilisant:
Xcode 6.0 (6A313) GM et
OSX 10.9.4
Mise à jour:
-----------
Si je reçois executeFetchRequest
résultat que l'option d'un tableau et utiliser [NSManagedObject]
au lieu de [Contact]
il fonctionne.
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:
-----------
Ce genre de problème se produit lorsque les instances d'entité n'est pas chargé à l'aide de votre NSManagedObject classe. Il y a plusieurs raisons pour lesquelles cela se produit, tout de qui mettent l'accent sur la "Base de Données ne pouvait pas trouver la classe que vous avez spécifié pour l'entité, sur la ligne de la classe dans le modèle de données."
Parmi les possibilités suivantes:
- Vous avez spécifié le mauvais package pour votre Swift classe
- Vous avez oublié de spécifier la classe
- Vous avez mal orthographié le nom
Dans mon cas, a été j'ai oublié de préciser que la classe POB montre dans sa réponse.
source d'informationauteur Sebastian
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure de reproduire le message d'erreur dans la console. Vous recevez ce message, car vous n'avez pas configuré correctement votre entité nom de la classe dans la Base de Données de l'Éditeur de Modèle (voir image ci-dessous).
Une fois cela fait, vous serez en mesure d'utiliser votre code d'origine avec
Contact
sous-classe. Vous pouvez en apprendre davantage sur les Données de Base et les espaces de noms ici.Dans mon cas, j'ai changé le Module "Actuelle de Produit du Module" à l'intérieur de Base de Données de l'Éditeur de Modèle.Il a commencé à travailler pour moi.
Je pense que c'est une mauvaise idée de définir le préfixe de votre nom de la cible comme cette
Parce que si vous souhaitez déplacer votre modèle dans d'autres applications, ou de modifier targer nom vous allez vous retrouver avec de le changer de nouveau,
Si il ya une autre façon. Si vous regardez comment xcode génère des données de base des entités maintenant, comme @A_man dit, vous devez définir le module en cours dans l'éditeur et de l'utilisation @objc() comme ceci :
Et le terrain doit être une option, car ils peuvent être nul
Vérifier la classe et module dans l'Entité de Modèle de Données de l'Inspecteur et de définir le nom de la classe comme nom de l'entité et le module comme Actuelles de Produit du Module'
Nom de la classe et Module
Je pense que votre problème est que executeFetchRequest donne en retour un tableau facultatif, pas un tableau. Vous avez besoin de déballer.