xcode core-data model swift nsmanagedobject

xcode - Generación de modelos Swift a partir de entidades de Datos centrales



core-data nsmanagedobject (6)

Actualización para Xcode 8:

En Xcode 8, uno necesita ir al Editor de Modelos de Datos Básicos y Mostrar el Inspector de Archivos. Cerca de la parte inferior hay una opción para la generación de código. Seleccione Swift.

Editar : Encontré la solución para generar un modelo de Swift a partir de la entidad de datos básicos:

En Xcode:

Editor> Crear NSManagedOjbect> Haga clic en el botón "Siguiente"> Haga clic en el botón "Siguiente"> Seleccione "Swift" Langage> Haga clic en el botón "Crear"

Intenté Swift langage creando un nuevo proyecto de Swift en Xcode 6 beta usando Core Data.

Cuando genero mis modelos a partir de las entidades de mi Core Data, Xcode crea modelos Objective-C.

¿Hay alguna forma de generar el modelo Swift en lugar del modelo Obejctive-C con Core Data?

Gracias !


Alternativamente, puede agregar #import "Person.h" al encabezado de puente, Project-Bridging-Header.h que Xcode genera para usted (si aceptó su oferta para generar). Luego puedes usar todo el Obj-C generado automáticamente como si fuera Swift nativo.


De acuerdo con el video de Apple sobre lo nuevo en el marco CoreData: 38 minutos (WWDC2014 Session 225), en el Modelo de datos del inspector, escriba el nombre de la clase con el nombre del proyecto. Como projectName.Doctor

Lo he intentado, pero lo que sucederá es que la clase de objeto gestionado generada se convierte en: projectName.swift en lugar de Doctor.swift . Incluso la declaración de clase se convierte en la clase projectName: ManagedObject

Solución:

En el inspector de modelo de datos, simplemente especifique el nombre y la clase de su objeto con el nombre que desea, por ejemplo: Doctor

Después de generar un modelo de objetos y seleccionar Swift, se creará un archivo ( Doctor.swift ).

Ahora, al insertar nuevos registros en Core Data, es posible que tenga un error de experiencia "Clase no encontrada, utilizando NSManagedObject predeterminado en su lugar" incluso si convierte el objeto recién insertado en un nombre de objeto correcto.

Para resolver esto, solo necesita agregar @objc (nombre de clase) arriba de la declaración de clase. Vea la muestra a continuación.

import Foundation import CoreData @objc(Doctor) class Doctor: NSManagedObject { @NSManaged var name: String }

Entonces:

let doctorManagedObject = NSEntityDescription.insertNewObjectForEntityForName("Doctor", inManagedObjectContext: context) as Doctor doctorManagedObject.name = "John" // you can now use dot syntax instead of setValue

Guarde el contexto para confirmar la inserción.


Echemos un vistazo en el camino de Objective-C:

Person.h (Header-File)

#import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @interface Person : NSManagedObject @property (nonatomic, retain) NSString *name; @end

Person.m (Archivo de Implementación)

#import "Person.h" @implementation Person @dynamic name; @end

Rápido

La documentación ya incluida en Xcode6-Beta dice:

Core Data proporciona el almacenamiento subyacente y la implementación de propiedades en subclases de la clase NSManagedObject. Agregue el atributo @NSManaged antes de cada definición de propiedad en su subclase de objeto administrado que corresponda a un atributo o relación en su modelo de Datos centrales. Al igual que el atributo @dynamic en Objective-C, el atributo @NSManaged informa al compilador de Swift que el almacenamiento y la implementación de una propiedad se proporcionarán en tiempo de ejecución. Sin embargo, a diferencia de @dynamic, el atributo @NSManaged solo está disponible para la compatibilidad con Core Data.

Así que así es como volvería a escribir el ejemplo anterior para Swift (no probado):

Person.swift

import CoreData class Person: NSManagedObject { @NSManaged var name : NSString }

Y de acuerdo con su pregunta, creo que la característica de generación de subclase podría no estar incluida todavía en Xcode6. ¿Se aseguró de haber elegido "Swift" como lenguaje de programación cuando estaba creando el Proyecto Cocoa en Xcode?



Puede recuperar el modelo de Swift utilizando NSEntityDescription.insertNewObjectForEntityForName pero debe editar su archivo de modelo de datos principal y no usar Person como Entidad de clase, pero <ProjectName>.Person else devuelve NSManagedObject ...

Al usar println() no verá la instancia Person sino algo así como <_TtC5ProjectName4Person: 0xc9ad5f0> pero al invocar métodos esto demostrará que es una instancia Person real. Supongo que es solo la forma en que Swift genera nombres de clase únicos, no conflictos, y los métodos de CoreData muestran este mecanismo interno.

La documentación de Apple dice :

Las clases Swift tienen un espacio de nombres, tienen un alcance para el módulo (generalmente, el proyecto) en el que están compiladas. Para usar una subclase Swift de la clase NSManagedObject con su modelo de Datos Core, prefije el nombre de la clase en el campo Clase en la entidad modelo inspector con el nombre de su módulo.


Editor -> Crear subclase NSManagedObject funciona bien para Swift

Simplemente siga todos los pasos habituales, pero cuando llegue a crear los archivos, elija Idioma ''Swift'' si es la primera vez que usa Crear subclase NSManagedObject con un proyecto Swift, estará predeterminado en Objective C