tutorial español data core-data swift3 ios10

español - Core Data Codegen falla en Xcode 8



core data swift 4 español (6)

Tengo una aplicación para iOS que contiene un modelo de datos básicos con 6 entidades. El Name entidad se configura de la siguiente manera:

Nombre de clase: Nombre

Módulo: Módulo de producto actual

Codeína: definición de clase

(las otras 5 entidades se configuran de manera similar).

Problema 1 (se corrigió pero se fue para la posteridad)

El código IS se genera en la carpeta de datos derivados ... no como ~ definiciones de clases como se esperaba, sino como extensiones en su lugar (nombradas como Name+CoreDataProperties.swift . No parece importar si el Codegen está configurado en Class Definition o Category / Extension - Todavía obtengo el mismo resultado.

OK, mantén ese pensamiento: de repente, tanto la clase como los archivos de extensión se están generando ahora ... parece que necesitas eliminar la carpeta de datos derivados del proyecto y reiniciar Xcode entre las actualizaciones. Ignorar el problema 1

Problema 2

Los archivos generados ignoran el modelo de datos. Opción de indicador opcional para los atributos y las relaciones de String: todos se generan como opcionales.

Problema 3 (arreglado pero saliendo para la posteridad)

Las relaciones ordenadas se generan como OrderedSet (y un error de compilación) en lugar de NSOrderedSet (no puede cambiarlas a medida que se vuelven a generar)

La solución para mí fue agregar temporalmente al proyecto ... public typealias OrderedSet = NSOrderedSet

OK, ahora el error del compilador se ha ido, y OrderedSet parece ser reconocido. Ignora el problema 3.

Problema 4

Ninguno de los anteriores realmente importa, porque el compilador no puede encontrar los archivos que acaba de generar. Para la entidad Name arriba:

: 0: error: no existe dicho archivo o directorio: ''/Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGenerated//.Name+ CoreDataClass.swift '': 0: error: no existe dicho archivo o directorio:'' /Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGenerated/ /.Name+CoreDataProperties.swift ''

Está buscando datos derivados para los archivos .Name+CoreDataClass.swift y .Name+CoreDataProperties.swift - fíjate en el ''.'' en la parte delantera de los nombres de los archivos. (Como solución temporal agregué los archivos generados en el proyecto)

Supongo que estoy haciendo algo mal, como si este fuera el caso para todos, nadie podría construir un proyecto de Datos Básicos ... ¿o son estos errores los que necesitan aumentarse?

Cheers Ash

(También planteado en los foros de desarrollo de Apple)


En relación con el problema 2: la bandera "opcional" de Core Data no tiene nada que ver con el concepto Swift de una opción. No están relacionados y no significan lo mismo. Marcar un atributo de Datos centrales como no opcional no implica que no sea opcional ya que Swift define el término. La diferencia es:

  • Swift no opcionales debe tener valores no nulos en todo momento .
  • Los datos no obligatorios de Core Data deben tener valores que no sean nulos cuando guarde los cambios , pero Core Data no sabe ni le importa si son nulos en otros momentos.

El problema # 4 suena como que Xcode se confunde, y puede ser arreglado por vudú como borrar manualmente la carpeta de datos derivados (de nuevo, lo sé). Actualmente no puedo reproducirlo, pero eso no significa que no sea un error en la versión beta actual.


El problema 4 puede solucionarse (al menos en la última versión beta, v. 6) seleccionando todas las entidades que desea generar automáticamente y luego en el inspector, borrando el campo Clase -> Módulo para que de manera predeterminada sea "Espacio de nombres global".


En realidad es bastante fácil arreglarlo.

Ir a la configuración:

Luego borra los puntos. Estos solo están ahí en proyectos más antiguos. Las declaraciones de importación se arreglan después de esto y está listo para continuar.

También debe colocar sus modelos en el espacio de nombres Global. Los míos estaban en un espacio de nombres adicional, pero no tengo idea de por qué.

Aproximación de las manzanas es que puedes usar esto en un marco personalizado.

Esta característica es bastante agradable, si la haces funcionar;)


Parece que Xcode 8.2.1 no desactivará codegen. Pero puede eliminar manualmente codeGenerationType="category" del archivo de contenido .xcdatamodel.

Cierre Xcode, elimine codeGenerationType , elimine la carpeta DerivedData y vuelva a generar.

Esperará la reparación en versiones futuras.


En cuanto al problema 1 , se supone que configurar el elemento emergente de Codegen en el inspector para una entidad en un modelo .xcdatadel debe funcionar así:

La categoría / extensión le dice a Xcode que genere un archivo, ClassName + CoreDataGeneratedProperties.

La definición de clase le dice a Xcode que genere dos archivos, el archivo arriba mencionado, más ClassName + CoreDataClass.

Sin embargo, parece que hay un error en Xcode 8.2. Si, después de cambiar una de estas ventanas emergentes, simplemente Build (⌘B) o Run (⌘R), sus cambios no tendrán efecto. Por ejemplo, si cambió de Class Definition a Category / Extension e incluso borró manualmente el segundo archivo, volverá a aparecer. Incluso puede encontrar que la ventana emergente vuelve a la configuración original.

Para que los cambios en estas ventanas emergentes se hagan efectivos, debes

  1. Guarde (⌘S) el archivo .xcdatamodel.
  2. Cierre todas las ventanas del proyecto.
  3. Reabrir el proyecto.

Durante la siguiente compilación (que puede ocurrir automáticamente cuando se abre el proyecto si tiene una @IBInspectable en un guión gráfico), los archivos afectados en Datos derivados se generarán o eliminarán para ajustarse a su nueva configuración.

ACTUALIZACIÓN 2016-12-22: Gracias por el comentario, Ashley. Ahora he escrito y enviado esto a Apple Bug Reporter: 29789727. Actualización 2017-02-08: Apple ha cerrado 29789727, ya que supuestamente duplica 21205277.


Me quedé completamente atrapado con el problema 4 y ninguno de los anteriores funcionó para mí. Yo uso generación de código Para resolverlo, hice los siguientes pasos:

  1. Abrí el archivo .xcdatamodel / content en un editor de texto. (En Xcode, haga clic derecho en su modelo .xcdata y seleccione "Abrir en editor externo"
  2. En el archivo XML me aseguré de que cada entidad tenga codeGenerationType="class"
  3. Cerrar y reabrir Xcode Despejó mi carpeta de datos derrived
  4. Todavía se negó a hacer la Generación de Código, entonces yo generé cada Entidad manualmente (Editor, Crear Subclases de NSManageObject, seleccione todas las entidades)
  5. Construye el proyecto. Ahora también apareció Generación de código y aparecieron errores del compilador que indicaban que los nombres de los archivos de la Entidad se usaban dos veces.
  6. Se eliminaron las subclases NSManagedObject creadas manualmente creadas en el paso 5.
  7. Después de eso, el proyecto se volvió a construir con éxito y el problema desapareció.

PD: si elige crear manualmente sus subclases NSManageObject en lugar de utilizar Generación de código, asegúrese de eliminar codeGenerationType="class" de sus entidades en el archivo XML en el paso 2.