swift core-data casting nsmanagedobject

swift - Datos básicos: no se pudo convertir el valor de tipo ''MyType_MyType_2'' a MyType



core-data casting (3)

  1. Establecer nombre de clase de entidad
  2. Establecer módulo "Módulo de producto actual" como abajo

Tengo una clase de modelo Objective-C MyType. Esta clase se usa en el código Swift:

NSEntityDescription.insertNewObjectForEntityForName("MyType", inManagedObjectContext: context) as! MyType

El as! arrojar resultados en el mensaje de error

Core Data: Could not cast value of type ''MyType_MyType_2'' (0x7be99a30) to MyType (0xf33db74).

Si lo NSManagedObject como NSManagedObject funciona. Cuando imprimo el resultado, puedo ver, sin embargo, que es una instancia real de MyType:

<MyType: 0x7ae06d50> (entity: MyType; id: 0x7aeba6d0 <x-coredata:///MyType/t957F2860-85F8-46E0-B6D6-4D1DF6C4EC613> ; data: { ...the fields... })

¿Que está sucediendo aquí? ¿Y de dónde viene el nombre MyType_MyType_2 ?


Cuando tuve este problema, fue porque me había olvidado de establecer la "clase" en la entidad. Esto es lo que se me ocurrió:

  1. Haga clic en el archivo .xcdatamodelId en el panel de la estructura de archivos / navegador de proyectos (extremo izquierdo).
  2. Seleccione la entidad con la que está teniendo problemas.
  3. En el panel Utilidades (a la derecha), busque el ícono que parece un teléfono celular de 1997, el inspector de modelos de datos.
  4. Debajo de la configuración de la entidad, deberías ver dos campos, "Nombre" y "Clase": configura "Clase" con el nombre de la clase que estás utilizando (generalmente lo mismo que "Nombre").

Incluso antes de seguir estos pasos, notará que la "clase" predeterminada es NSObject, que refleja el mensaje de error. También encontré algunas formas programáticas de hacer esto, pero esta parecía la solución más simple / más rápida.

Debo señalar que mi modelo FUE escrito en Swift, así que tuve que agregar la referencia de interoperabilidad @objc (Entidad) mencionada por @zellb. Pero eso no debería hacer una diferencia en la solución siempre y cuando esté haciendo esa parte correctamente (y eso causaría un error diferente de mi comprensión).


solo prueba esto

@objc(MyType) public class MyType: NSManagedObject { // your class }

en lugar de esto:

class MyType: NSManagedObject { // your class }