ios core-data swift3 nsmanagedobject ios8.1

ios - la redeclaración no válida en el código automático genera NSManagedObject Subclass Swift 3



core-data swift3 (9)

Usando la versión 8.1 de Xcode.

Cree una entidad llamada "MapRegionObject" en el archivo .xcdatamodeld.

Con el generador de código automático, haga clic en Editor en la barra de navegación -> crear subclase NSManagedOject ...

Tengo dos archivos: MapRegionObject + CoreDataClass.swift y MapRegionObject + CoreDataProperties

Errores en dos archivos que se muestran en la captura de pantalla: MapRegionObject + CoreDataClass.swift

MapRegionObject + CoreDataProperties

Por favor, ayúdame a corregir estos errores, ¡muchas gracias!


1) limpiar el proyecto (cmd + shift + K)

2) En el "inspector del modelo de datos" para cada atributo de conjunto de entidades creado para la clase, como en la captura de pantalla siguiente

3) Generar código nuevamente (Editor -> crear subclases de NSManagedObject)

Después de eso, todo debería funcionar bien.


Cierre el proyecto y siga las siguientes instrucciones:

  1. Revele en el buscador su archivo de base de datos .xcdatamodeld.
  2. en el archivo .xcdatamodeld, haga clic derecho -> Mostrar contenido del paquete, si (.xcdatamodel) se encuentra nuevamente en el paquete, haga clic derecho y ''Mostrar contenido del paquete''. deberías obtener el archivo ''contenido''.
  3. Abra ''contenidos'' en la edición de texto.
  4. Comando-F (codeGenerationType = "class") y reemplace todas las cadenas de coincidencias con una cadena en blanco.

Guarde y abra el proyecto Xcode nuevamente. Todo debería funcionar bien.


El problema es que ya no necesita generar subclases NSManagedObjectModel manualmente. ref: https://forums.developer.apple.com/thread/48988

Xcode genera automáticamente clases o extensiones de clase para las entidades y propiedades en un modelo de datos de Core Data. La generación automática de código está habilitada y deshabilitada entidad por entidad, y está habilitada para todas las entidades en los nuevos modelos que utilizan el formato de archivo Xcode 8. Esta función está disponible para cualquier modelo de datos que se haya actualizado al formato Xcode 8. Usted especifica si Xcode genera código Swift u Objective-C para un modelo de datos utilizando el inspector de archivos del modelo de datos. Cuando la generación automática de código está habilitada para una entidad, Xcode crea una clase o una extensión de clase para la entidad como se especifica en el inspector de la entidad: se usa el nombre de clase especificado y las fuentes se colocan en los Datos Derivados del proyecto. Tanto para Swift como para Objective-C, estas clases se pueden usar directamente desde el código del proyecto. Para Objective-C, se crea un archivo de encabezado adicional para todas las entidades generadas en su modelo: el nombre del archivo se ajusta a la convención de nomenclatura ''DataModelName + CoreDataModel.h''.


En Xcode 8.1, antes de usar el generador de código automático, debe seleccionar la entidad en su modelo de datos:

Luego vaya a la pestaña Inspector de modelo de datos:

En "Codegen" seleccione "Manual / Nodo"

Después de eso, puede crear una subclase de NSManagedObject sin errores.

Alternativamente, si ya ha utilizado ''Definición de clase'', puede acceder a su archivo .xcdatamodeld existente y establecer todas las entidades actuales en ''Manual / None'' en Codegen. Asegúrese de guardar su proyecto (Archivo -> Guardar) , eliminar sus Datos Derivados existentes, limpiar el proyecto y luego compilar. Lo resolvió para mí sin tener que volver a hacer todo mi modelo.


En Xcode 8.2.1, Menú-Producto-Limpio, y todo está bien, es muy correcto.



Esta no es una respuesta. Es solo una explicación de lo que está sucediendo con las selecciones

Asegúrese de ver este momento para el curso de Core Data Stanford

A continuación hay una transcripción que escribí yo mismo (no es 100% precisa):

El valor predeterminado es class definition , si elige esta. Generará esa subclase y simplemente funcionará. Podrá acceder a sus tweets como una clase llamada Tweet. Esto suena bien. Por cierto, si haces esto, NO aparecerá en tu navegador de archivos .

La que elegimos con más frecuencia es la category/extension lo que esto hará solo generará una extensión de la clase Tweet. Tienes que escribir la clase de tweet en sí. La extensión se encargará de hacer todos los vars. Incluso cuando cambio a categoría / extensión nuevamente , no aparece esa extensión en el navegador . Está algo oculto para ti.

¿Y por qué nos gusta este? Porque muchas veces queremos agregar nuestro propio código. Al igual que en un Tweet, imagina que deseas agregar un método estático que tomó datos de Twitter y los convirtió en un tweet en la base de datos. ¿Dónde pondríamos el código? Bueno, un gran lugar para poner ese código sería en la clase Tweet ... si hubiera tal cosa ... y la extensión se encargará de todos los negocios de var por usted.

Si eligió manual/none para codegen. lo que significa que no haga ningún codegen, entonces estaría haciendo value/setValue(forKey:) ... buena suerte con eso. value/setValue(forKey:) código va a ser un desastre. [es decir, no hay .propertyName = value ... había que hacer setValue(value, forKey: propertyName) ].

En pocas palabras, no estoy seguro de por qué, pero por alguna razón si no selecciona la subclase crear NSManagedObject , parece que todavía funciona, pero sin mostrar lo que sucede debajo del capó. Muy contrario intuitivo!

Luego, también vea esta demostración en vivo del curso Core Data Stanford :

Ahora sabemos que queremos acceder a todo esto sin usar value / set (value: forKey:) ... queremos tener subclases de Usuarios / Tweets. Y queremos tener vars [notación de puntos] para todas estas relaciones, por lo que necesitamos generar ese código. De la forma en que lo hacemos, solo seleccionamos la entidad ... y pasamos aquí a CodeGen. Esto dice por definición de clase por defecto. Eso significa que ya está hecho. Se ha generado una clase llamada Tweet. Funcionará con var y todas las relaciones. Eso no es realmente lo que queremos. Queremos seleccionar esta [Categoría / Extensión]. Donde solo crea una extensión para Tweet y agrega las cosas var. Eso es porque queremos escribir el Tweet de la clase y poner nuestro propio código allí . Es muy común escribir nuestra propia clase. Pero aún quieres la magia var.


No luches con Xcode en esto a menos que realmente necesites alterar tus propiedades generadas, hacerlo te dejará frustrado.

Piense en la clase autogenerada como cualquier otra clase en su aplicación. Si necesita agregar funcionalidad a su clase de objeto administrado, simplemente cambie su definición de clase en una extensión y extienda su objeto.

cambia tu clase:

class MyManagedObject : NSManagedObject { /* implementation*/ }

a una extensión:

extension MyManagedObject { /* implementation */ }


Todo esto me pareció muy confuso. Realmente necesitas entender qué hay de nuevo en CoreData. Básicamente, el valor predeterminado es generar automáticamente la clase y las extensiones para usted en un lugar llamado "DerivedData" que está enterrado en ~ / Library / Developer / Xcode / DerivedData donde viven estas clases y sus extensiones, fuera de su fuente de código. Personalmente, no poder abrirlos y mirarlos es extraño para mí, pero es algo para acostumbrarse.

Básicamente, si tiene una entidad llamada "AppSettings" en su modelo CoreData, puede usarla sin necesidad de generar el código usted mismo. Si desea el código en su proyecto, establezca la propiedad Codegen en la entidad en Manual / Ninguno. Luego haga lo que hizo antes: Editor-> Crear clases NSManagedObject, etc. Los archivos terminarán en su proyecto.

La buena noticia es que si desea hacer extensiones personalizadas, simplemente haga eso en su proyecto. Xcode combinará los archivos generados, desde su otro lugar fuera de su directorio de proyecto, con los archivos en su directorio de proyecto.