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?
Probé @NSManaged, no funcionó. :(. Pero los archivos de modelos mixtos (.h) generados por xcdatamodel, tienen éxito. Lea el doc y el código en https://github.com/iascchen/SwiftCoreDataSimpleDemo
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