Xcode está buscando nombres de entidades de datos centrales con punto; no comstackndo

He estado trabajando en un proyecto por un tiempo, y recientemente me actualicé a Xcode 8 y Swift 3.0 e iOS 10. Pero desde que lo hice no he podido comstackr.

Recibo un error para cada una de mis entidades:: 0: error: no hay tal archivo o directorio: ” /Users/mark/Library/Developer/Xcode/DerivedData/…/.Account+CoreDataProperties.swift ‘Each case tiene un . (punto) prefijo antes del nombre de la entidad: .Account + CoreDataProperties.swift.

Cambié la Generación de código de “Categoría / Extensión” a Manual / Ninguna, hago un directorio limpio y limpio, y elimino el directorio DerivedData. Curiosamente, cuando miro en el directorio apropiado, hay un archivo real allí, simplemente sin el prefijo de punto.

Esto es muy confuso ¿Alguien puede explicarlo? Necesito resolver esto para poder continuar con los datos centrales.

TIA Mark

Los archivos de puntos son generados por Xcode8. Ver WWDC2016 . Me encontré con el mismo problema después de tener que eliminar los datos derivados debido a otro problema.

Dos posibles soluciones:

1) El enfoque recomendado y moderno

  • Elimine todas las subclases NSManagedObject generadas de su proyecto, si existe.
  • Establezca Codegen en Class Definition en su .xcdatamodel para todas las entidades
  • Asegúrese de que el Module esté vacío (“Espacio de nombres global” en gris claro) (solución provisional a un error de Apple, vea la respuesta de @Chris Hanson )

  • Proyecto limpio
  • Limpiar la carpeta DerivedData

Nota: Aunque no vea los archivos generados en su proyecto, Xcode tiene una referencia, por lo que puede escribir extensiones y cosas por el estilo. Por ejemplo:

 extension MyEntity { func doSomething() { // } } 

Además, puede ordenar + hacer clic en el archivo generado dentro de Xcode.

2) Un enfoque bastante paranoico pero de prueba de balas, ignorando las nuevas características de Xcode

  • Elimine todas las subclases NSManagedObject generadas de su proyecto, si existe.
  • Establezca Codegen en Manual/None en su .xcdatamodel para todas las entidades
  • Proyecto limpio
  • Limpiar la carpeta DerivedData
  • Reiniciar Xcode
  • Generar manualmente subclases NSManagedObject (en el menú “Editor”)
  • Asegúrese de que esos archivos se agreguen a su proyecto
  • construir

Si su problema persiste, repita:

  • Proyecto limpio
  • Limpiar la carpeta DerivedData
  • Reiniciar Xcode

Esto ocurre cuando el módulo de una entidad se establece en “Módulo de producto actual” (por ejemplo, para estar dentro del espacio de nombres Swift, en lugar del espacio de nombres global Objective-C).

La solución para esto es eliminar la personalización del campo “Módulo” de la entidad, por lo que tiene el valor predeterminado de “Espacio de nombres global” (en texto gris claro).

Cambié el Código Gen de “Categoría / Extensión”

Cambiar Codegen a definición de clase.

enter image description here

Ahora deshazte de lo que estabas haciendo en el código para convertir tus entidades en pseudo-clases. ¡Tus entidades ahora son clases reales !

Ahora podrá reducir su código considerablemente. Ya no tiene que abandonar para especificar un tipo de entidad como clase. Cuando recupera objetos Person, los resultados de su búsqueda son generics y se parametrizan en Person, por lo que cada objeto recuperado es Person. Del mismo modo, para crear una Persona nueva, simplemente llame a Person(context:) y configure, y guarde la tienda. La palabra “entidad” probablemente dejará de existir en cualquier parte de tu código.

Lo he resuelto Estaba a punto de reconstruir toda la aplicación desde cero para evitar el problema, y ​​noté que los archivos de la clase de entidad estaban en el directorio, aunque no estaban visibles en Xcode. Así que borré esos archivos y eso borró ese obstáculo.

Estoy muy feliz ahora.