web-dev-qa-db-fra.com

redéclaration invalide en code automatique générer NSManagedObject Subclass Swift 3

Utilisation de la version 8.1 de Xcode.

Créez une entité nommée "MapRegionObject" dans le fichier .xcdatamodeld.  enter image description here

À l'aide du générateur de code automatique, cliquez sur Editeur dans la barre de navigation -> créer une sous-classe NSManagedOject ... 

Vous avez deux fichiers: MapRegionObject + CoreDataClass.Swift et MapRegionObject + CoreDataProperties

Erreurs dans deux fichiers apparaissant sur la capture d'écran: MapRegionObject + CoreDataClass.Swift  enter image description here

MapRegionObject + CoreDataProperties  enter image description here

S'il vous plaît, aidez-moi à résoudre ce problème, merci beaucoup!

50
Summer Ji

Dans Xcode 8.1, avant d'utiliser le générateur de code automatique, vous devez sélectionner l'entité dans votre modèle de données:

Entity

Ensuite, accédez à l'onglet Inspecteur de modèle de données:

Data Model Inspector

Sous "Codegen" sélectionnez "Manuel/Noeud"

Après cela, vous pourrez créer une sous-classe NSManagedObject sans erreur. 


Si vous avez déjà utilisé 'Définition de classe', vous pouvez également aller dans votre fichier .xcdatamodeld existant et définir toutes les entités actuelles sur 'Manuel/Aucun' sous Codegen. Veillez à enregistrer votre projet (Fichier -> Enregistrer) , supprimez vos données dérivées existantes, nettoyez le projet, puis générez. Résolu pour moi sans avoir à refaire tout mon modèle.

121
Kamillpg

J'ai trouvé tout cela très déroutant. Vous devez vraiment comprendre les nouveautés de CoreData. Fondamentalement, la valeur par défaut est de générer automatiquement la classe et les extensions pour vous dans un emplacement appelé "DerivedData" qui est enterré dans ~/Library/Developer/Xcode/DerivedData où ces classes et leurs extensions résident, en dehors de votre code la source. Personnellement, ne pas être capable de les ouvrir et de les regarder m’est bizarre, mais c’est quelque chose d’être utilisé. 

Fondamentalement, si vous avez une entité appelée "AppSettings" dans votre modèle CoreData, vous pouvez simplement l'utiliser sans avoir à générer le code vous-même. Si vous voulez le code dans votre projet, définissez la propriété Codegen de l'entité sur Manuel/Aucun. Ensuite, faites ce que vous avez fait auparavant: Editeur-> Créer des classes NSManagedObject, etc. Les fichiers se retrouveront dans votre projet. 

La bonne nouvelle est que si vous souhaitez créer des extensions personnalisées, faites-le simplement dans votre projet. Xcode mélangera les fichiers générés, situés en dehors du répertoire de votre projet, aux fichiers de votre répertoire de projet.

18
P. Ent

1) nettoyer le projet (cmd + shift + K)

2) Dans "l'inspecteur de modèle de données" pour chaque attribut d'ensemble d'entités créé pour la classe, comme dans la capture d'écran ci-dessous

 screenshot

3) Générez à nouveau le code (éditeur -> créer des sous-classes NSManagedObject)

Après cela, tout devrait bien fonctionner.

7
Andrey

Le problème est qu'il n'est plus nécessaire de générer manuellement les sous-classes NSManagedObjectModel . Ref: https://forums.developer.Apple.com/thread/48988

Xcode génère automatiquement des classes ou des extensions de classe pour le fichier entités et propriétés dans un modèle de données Core Data. Code automatique la génération est activée et désactivée entité par entité, et est activé pour toutes les entités des nouveaux modèles utilisant le fichier Xcode 8 format. Cette fonctionnalité est disponible pour tous les modèles de données ayant été mis à niveau au format Xcode 8. Vous spécifiez si Xcode génère Code Swift ou Objective-C pour un modèle de données utilisant le fichier du modèle de données inspecteur. Lorsque la génération automatique de code est activée pour une entité, Xcode crée une classe ou une extension de classe pour l'entité en tant que spécifié dans l'inspecteur de l'entité: le nom de classe spécifié est utilisé et les sources sont placées dans les données dérivées du projet. Pour les deux Swift et Objective-C, ces classes sont directement utilisables depuis le code du projet. Pour Objective-C, un fichier d’en-tête supplémentaire est créé pour toutes les entités générées dans votre modèle: Le nom du fichier est conforme à la convention de dénomination 'DataModelName + CoreDataModel.h'.

3
victor_luu

Dans Xcode 8.2.1, Menu-Product-Clean Et tout va bien, c'est tellement vrai.

2
saneryee

Fermez le projet et suivez les instructions suivantes:

  1. Révélez dans le Finder votre fichier de base de données .xcdatamodeld.
  2. sur le fichier .xcdatamodeld, cliquez avec le bouton droit de la souris -> Afficher le contenu du paquet, si (.xcdatamodel) est à nouveau trouvé dans le paquet, cliquez à nouveau avec le bouton droit de la souris et 'Afficher le contenu du paquet'. vous devriez obtenir le fichier 'contenu'.
  3. Ouvrez le 'contenu' dans l'édition de texte.
  4. Commande-F (codeGenerationType = "class") et remplacez toutes les chaînes de correspondance par une chaîne vide.

Enregistrez et ouvrez à nouveau le projet Xcode. Tout devrait bien fonctionner.

2
Satendra dagar
1
Summer Ji

Ne vous battez pas avec Xcode à ce sujet sauf si vous vraiment avez besoin de modifier vos propriétés générées, cela vous laissera simplement frustré.

Pensez à la classe générée automatiquement comme à toute autre classe de votre application. Si vous avez besoin d'ajouter des fonctionnalités à votre classe d'objets gérés, changez simplement la définition de la classe en une extension et développez votre objet.

change de classe:

class MyManagedObject : NSManagedObject { /* implementation*/ }

à une extension:

extension MyManagedObject { /* implementation */ }
1
Dan Beaulieu