web-dev-qa-db-fra.com

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

Mise à jour pour Xcode 8:

Dans Xcode 8, vous devez accéder à l'éditeur de modèle de données principal et afficher l'inspecteur de fichiers. Près du bas est une option pour la génération de code. Sélectionnez Swift.

Edit: J'ai trouvé la solution pour générer un modèle Swift à partir de l'entité Core Data:

Sur Xcode:

Editeur> 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é le langage Swift en créant un nouveau projet Swift sur Xcode 6 bêta à l'aide de Core Data.

Lorsque je génère mes modèles à partir des entités de mon Core Data, Xcode crée des modèles Objective-C.

Existe-t-il un moyen de générer le modèle Swift plutôt que le modèle Obejctive-C avec Core Data?)

Merci !

50
Jean Lebrument

Jetons un coup d'oeil sur la manière Objective-C:

Person.h (Fichier d'en-tête)

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

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

Person.m (Fichier d'implémentation)

#import "Person.h"

@implementation Person
@dynamic name;
@end

Swift

La documentation déjà incluse dans Xcode6-Beta indique:

Core Data fournit le stockage sous-jacent et l'implémentation des propriétés dans les sous-classes de la classe NSManagedObject. Ajoutez l'attribut @NSManaged avant chaque définition de propriété dans votre sous-classe d'objet géré qui correspond à un attribut ou à une relation dans votre modèle Core Data. Comme l'attribut @dynamic dans Objective-C, l'attribut @NSManaged informe le compilateur Swift que le stockage et l'implémentation d'une propriété seront fournis à l'exécution. Toutefois, contrairement à @dynamic, le @NSManaged Cet attribut est uniquement disponible pour le support Core Data.

Voilà donc comment je réécrirais l'exemple ci-dessus pour Swift (non testé):

Person.Swift

import CoreData

class Person: NSManagedObject {

    @NSManaged var name : NSString

}

Et selon votre question, je pense que la fonctionnalité de génération de sous-classe n'est peut-être pas encore incluse dans Xcode6. Vous êtes-vous assuré d'avoir choisi "Swift" comme langage de programmation lors de la création de Cocoa-Project dans Xcode?

30
wottpal

Vous pouvez obtenir le modèle Swift en utilisant NSEntityDescription.insertNewObjectForEntityForName] Mais vous devez modifier votre fichier de modèle de données principal et ne pas utiliser Person comme entité de classe, mais <ProjectName>.Person sinon, il retourne NSManagedObject...

En utilisant println(), vous ne verrez pas l'instance Person, mais quelque chose comme <_TtC5ProjectName4Person: 0xc9ad5f0>, Mais appeler des méthodes à ce sujet prouvera qu'il s'agit bien d'une instance Person. J'imagine que c'est juste le moyen pour Swift de générer des noms de classes uniques, pas de conflits et les méthodes CoreData montrent ce mécanisme interne.

Le la documentation Apple dit :

Les classes Swift sont des espaces de noms. Elles sont définies dans le module (généralement, le projet) dans lequel elles sont compilées. Pour utiliser une sous-classe Swift de la classe NSManagedObject avec votre modèle Core Data, préfixez la classe nom dans le champ Classe de l'inspecteur d'entité de modèle avec le nom de votre module.

12
Fabien Penso

Selon la vidéo d'Apple concernant les nouveautés Dans le cadre CoreData: 38 minutes (WWDC2014 Session 225), dans le modèle de données de l'inspecteur, préfixez le nom de la classe avec le nom du projet. Comme NomProjet.Doctor

J'ai essayé cela, mais ce qui va arriver, c'est que la classe d'objets gérés générée devient: nomProjet.Swift au lieu de Doctor.Swift. Même la déclaration de classe devient classe projectName: ManagedObject

Solution:

Dans l'inspecteur de modèle de données, spécifiez simplement le nom et la classe de votre objet avec le nom de votre choix, exemple: Doctor

Après avoir généré un modèle d'objet et sélectionné Swift, un fichier sera créé (Doctor.Swift).

Désormais, lors de l’insertion de nouveaux enregistrements dans Core Data, une erreur d’expérience peut apparaître: "Classe introuvable, utilisation de NSManagedObject par défaut" , même si vous convertissez le nouvel élément inséré. object à un nom d'objet correct.

Pour résoudre ce problème, il vous suffit d’ajouter @ objc (nom de 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
}

Ensuite:

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

Enregistrer le contexte pour valider insérer.

11
Zaldy

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.

3
JefferyRPrice

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 le document et le code dans https://github.com/iascchen/SwiftCoreDataSimpleDemo

3
IascCHEN

Editor -> Créer une sous-classe NSManagedObject fonctionne bien pour Swift

Suivez simplement toutes les étapes habituelles, mais lorsque vous créerez les fichiers, choisissez la langue 'Swift' si c'est la première fois que vous l'utilisez Create NSManagedObject Subclass avec a Swift projet, il sera paramétré par défaut sur Objective C

2
Magoo