executeFetchRequest arroja un error fatal: el elemento NSArray no pudo coincidir con el tipo de elemento de matriz Swift

Estoy probando rápidamente con CoreData y creé el siguiente código:

import UIKit import CoreData class Contact: NSManagedObject { @NSManaged var name: String @NSManaged var email: String class func execute(){ let appDel:AppDelegate = (UIApplication.shanetworkingApplication().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 = "john@apple.com" 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)") } } 

Cuando corro:

 Contact.execute() 

Entonces el comstackdor lanza este error:

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

Cuando trato de get valores de array:

  let firstContact = result[0] as Contact 

Creo que el problema está en executeFetchRequest . En Objective-c, el tipo de executeFetchRequest de executeFetchRequest es un NSArray . Ahora en Swift, el tipo de retorno es un [AnyObject]? .

Intenté lanzar [AnyObject]? resultado a NSArray , pero Xcode dijo:

  Cannot convert the expression's type '[AnyObject]?' to type 'NSArray' 

¿Qué estoy haciendo mal?

Estoy usando: Xcode 6.0 (6A313) GM y OSX 10.9.4

Actualizar:
———–

Si executeFetchRequest resultado executeFetchRequest como una matriz opcional y utilizo [NSManagedObject] lugar de [Contact] funciona.

 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)") } 

Actualización2:
———–

Este tipo de problema ocurre cuando las instancias de entidad no se cargaron utilizando su class NSManagedObject. Hay algunas razones diferentes por las que eso sucede, todo lo cual se centra en "Core Data no pudo encontrar la class que especificó para esa entidad en la línea de class en el model de datos".

Entre las posibilidades:
– Ha especificado el package incorrecto para su class Swift
– Se te olvidó especificar la class
– Has escrito mal el nombre

En mi caso me olvidé de especificar la class, ya que el POB aparece en su respuesta.

Pude reproducir tu post de error en la console. Obtiene este post porque no configuró correctamente el nombre de la class de entidad en el Core Model Model Editor (ver image a continuación).

introduzca la descripción de la imagen aquí

Una vez hecho esto, podrá usar su código original con la subclass de Contact . Puede get más información sobre Core Data y espacios de nombres aquí .

En mi caso, cambié el Módulo como "Módulo de Producto Actual" dentro del Core Model Model Editor. Empezó a funcionar bien para mí. introduzca la descripción de la imagen aquí

Creo que su problema es que executeFetchRequest devuelve una matriz opcional, no una matriz. Necesitas desenvolverlo.

 if let result: [Contact]? = context.executeFetchRequest(fetch, error: nil) as? [Contact] { let firstContact = result[0] println("/(firstContact.name)") println("/(firstContact.email)") } 

Creo que es una mala idea establecer el prefijo de tu nombre de destino como este. Porque si quieres mover tu model a otra aplicación o cambiar el nombre de Targer, terminarás cambiándola de nuevo,

Entonces hay otra forma. Si observas cómo xcode genera entidades de datos centrales ahora, como @A_man dijo que necesitas configurar el module actual en el editor y usar @objc () así:

 import CoreData @objc(Contact) class Contact: NSManagedObject { @NSManaged var name: String? @NSManaged var email: String? } 

Y el campo tiene que ser opcional porque pueden ser nulos

Verifique la class y el module en la Entidad desde el Inspector del model de datos y establezca el nombre de la class como nombre y module de la entidad como "Módulo de producto actual" Nombre de class y Módulo