52 votes

Génération de modèles Swift à partir d'entités Core Data

Edit: j'ai trouvé la solution pour générer rapidement un modèle de Base de Données de l'entité:

Sur Xcode:

L'éditeur de > Créer NSManagedOjbect > Cliquez sur le bouton "Suivant" > Cliquez sur le bouton "Suivant" > Sélectionnez "Swift" Langage > Cliquez sur le bouton "Créer"


J'ai essayé Swift langage par la création d'une nouvelle Swift projet Xcode 6 bêta à l'aide de Données de Base.

Lorsque je créer mes modèles à partir de ma Base de Données les entités, Xcode crée Objective-C modèles.

Est-il un moyen de générer Swift modèle plutôt que de l'Objectif-C modèle avec Base de Données ?

Merci !

32voto

wottpal Points 621

Permet d'avoir un regard sur l'Objective-C moyen:

Personne.h (en-Tête de Fichier)

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface Person : NSManagedObject
@property (nonatomic, retain) NSString *name;
@end

Personne.m (mise en Œuvre de Fichier)

#import "Person.h"

@implementation Person
@dynamic name;
@end

Swift

La documentation déjà inclus dans Xcode6-Bêta dit:

Base de Données fournit le stockage sous-jacent et la mise en œuvre de propriétés dans les sous-classes de la NSManagedObject classe. Ajouter le @NSManaged attribut avant chaque définition de propriétés de votre objet géré sous-classe qui correspond à un attribut ou une relation dans votre Base de Données modèle. Comme l' @attribut dynamique en Objective-C, le @NSManaged attribut informe le Swift compilateur que le stockage et la mise en œuvre d'une propriété sera fournie au moment de l'exécution. Cependant, contrairement à @dynamique, l' @NSManaged attribut est uniquement disponible pour les Données de Base de soutien.

Donc, c'est comment je pourrais réécrire l'exemple ci-dessus pour Swift (pas testé):

Personne.swift

import Cocoa

class Person: NSManagedObject {

    @NSManaged var name : NSString

}

Et en fonction de votre question, je pense que le sous-classe-génération-fonctionnalité peut ne pas être inclus dans Xcode6 encore. Avez-vous fait en sorte que vous avez choisi "Swift" comme le langage de programmation lors de la création de la Cacao-Projet dans Xcode?

12voto

Fabien Penso Points 183

Vous pouvez obtenir rapidement le modèle à l'aide de NSEntityDescription.insertNewObjectForEntityForName mais vous devez modifier votre base de données fichier de modèle et de ne pas utiliser Person comme une Classe d'Entité, mais <ProjectName>.Person sinon il retourne NSManagedObject...

À l'aide de println() vous ne verrez Person instance, mais quelque chose comme <_TtC5ProjectName4Person: 0xc9ad5f0> mais l'appel de méthodes sur ce va prouver que c'est un Person exemple pour de vrai. Je suppose que c'est juste la façon de Swift pour générer des noms de classe uniques, pas de conflit et de CoreData méthodes montrer ce mécanisme interne.

La documentation d'Apple dit:

Swift classes sont des espaces-ils sont dans l'étendue du module (en général, le projet), ils sont dressés. L'utilisation d'un Swift sous-classe de la NSManagedObject classe avec votre modèle de Données central, préfixe le nom de la classe dans le champ de la Classe dans le modèle entité inspecteur avec le nom de votre module.

11voto

Zaldy Points 202

Selon Apple, la vidéo concernant Ce qui est nouveau Dans CoreData cadre: 38mins (WWDC2014 Session 225), dans l'inspecteur du Modèle de Données, préfixe le nom de la classe avec le nom de projet. Comme projectName.Médecin

J'ai essayé cela, mais ce qui va se passer c'est que le géré la classe d'objet devient: projectName.swift à la place de Médecin.swift. Même la déclaration de la classe devient la classe nom_du_projet: ManagedObject

Solution:

Dans le modèle de Données de l'inspecteur, il suffit de spécifier le Nom et la Classe de votre objet à quel nom que vous voulez, exemple: Médecin

Après avoir généré un modèle d'objet et en sélectionnant Swift, ce qui va créer un fichier (un Médecin.swift).

Maintenant, lors de l'insertion de nouveaux enregistrements dans la Base de Données, vous risquez une expérience d'erreur "Classe pas trouvé, en utilisant par défaut NSManagedObject au lieu de" même si vous lancez la nouvellement inséré un objet à un nom d'objet approprié.

Pour résoudre ce problème, vous avez juste besoin d'ajouter @objc(nom de la classe) au-dessus de la déclaration de classe. Voir exemple ci-dessous.

import Foundation
import CoreData

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

Alors:

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

Enregistrer pour valider insérer.

3voto

IascCHEN Points 31

J'ai testé @NSManaged, cela n'a pas fonctionné. :(. Mais les fichiers de modèles mixtes (.h) générés par xcdatamodel ont réussi. Veuillez lire la doc et le code dans https://github.com/iascchen/SwiftCoreDataSimpleDemo

3voto

JefferyRPrice Points 505

Alternativement, vous pouvez simplement ajouter #import "Person.h" à l'en-tête de pontage, Project-Bridging-Header.h que Xcode génère pour vous (si vous avez accepté que l'offre soit générée). Ensuite, vous pouvez utiliser tous les Obj-C générés automatiquement comme s'il s'agissait de Swift natif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X