J'ai essayé d'ajouter des données de base. Et chaque fois j'ai la même erreur:
error: filename "EntityName +CoreDataClass.Swift" used twice: '/Users/userName/Desktop/Development/MyApp/AppName/EntityName +CoreDataClass.Swift' and '/Users/userName/Library/Developer/Xcode/DerivedData/AppName-dgwzrmxsetzvtedibxrazuutjwnh/Build/Intermediates/AppName.build/Debug-iphoneos/AppName.build/DerivedSources/CoreDataGenerated/Model/EntityName +CoreDataClass.Swift'
J'ajoute des données de base en procédant comme suit:
1.Nouveau fichier/Modèle de données; enregistrez-le dans le répertoire racine de mon projet
sélectionnez Model.xcdatamodeld et ajoutez une entité, ajoutez plusieurs attributs, enregistrez, créez/créez une sous-classe NSManagedObjectClass.
En conséquence, j'observe 4 nouveaux fichiers dans le navigateur: Model.xcdatamodeld, EntityName + CoreDataProperties.Swift, EntityName + CoreDataClass.Swift,COREDATA_DATAMODELNAME+ CoreDataModel.Swift
leur contenu:COREDATA_DATAMODELNAME+ CoreDataModel.Swift:
import Foundation
import CoreData
___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
EntityName + CoreDataClass.Swift:
import Foundation
import CoreData
class EntityName: NSManagedObject {
}
EntityName + CoreDataProperties.Swift:
import Foundation
import CoreData
extension EntityName {
@nonobjc class func fetchRequest() -> NSFetchRequest< EntityName > {
return NSFetchRequest< EntityName >(entityName: "EntityName");
}
@NSManaged var str: String?
}
Ce que j'ai essayé
1. Nettoyer la construction, supprimer DerivedData, supprimer le contenu de var/folder, redémarrer
2. Supprimer les fichiers générés, affichés dans le navigateur
Tous mes efforts ont été malchanceux.
Qu'est ce que je fais mal?
Xcode 8 inclut la génération automatique de classes NSManagedObject
lorsque le fichier de modèle utilise le format de fichier Xcode 8. Si vous créez vos propres fichiers de sous-classe, vous créez des doublons. Le deuxième fichier du message d'erreur, dans DerivedSources
, est celui que Xcode a créé automatiquement.
Si les fichiers générés automatiquement font ce dont vous avez besoin, arrêtez de créer les vôtres et tout ira bien.
Si vous souhaitez créer vos propres sous-classes, vous pouvez soit
Il y a deux bogues dans XCode 8 ici:
1 - Si vous modifiez la liste déroulante Codegen, sa nouvelle valeur n'est pas enregistrée dans Model.xcdatamodel. Vous devez changer quelque chose d'autre pour le sauver. Par exemple, changez le nom de la classe. construire; changer le nom de la classe en arrière; construire à nouveau.
2 - Le code généré est placé dans DerivedData dans le dossier Intermediates, mais cela ne se produit que si le dossier n'existe pas déjà. La solution consiste à effectuer un nettoyage, puis une construction.
En fait, j'ai le même problème (avec Swift) et je suppose que c'est un bug. Si je comprends bien, l'OP utilise les sous-classes NSManagedObject autogen de Xcode et ne crée pas ensuite de sous-classes supplémentaires (superflues), ce qui semble être une source de confusion.
Étapes à suivre pour reproduire:
Créez un nouveau projet, application à vue unique. Cochez "Utiliser les données de base"
Créez une entité dans l'entité de modèle, ajoutez des propriétés, assurez-vous que le fichier est sauvegardé (parfois Xcode 8 beta envoie les données s’il n’est pas explicitement enregistré enregistré)
Xcode crée 3 fichiers:
COREDATA_DATAMODELNAME_ + CoreDataModel.Swift. Ce fichier est Corrompu et contient des entrées non valides à la suite des instructions de Import Foundation et CoreData - le projet ne sera pas compilé sauf si Ce fichier est supprimé.
import Foundation
import CoreData
___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
EntityName + CoreDataClass.Swift
EntityName + CoreDataProperties.Swift
Bien que l'éditeur ne signale aucune erreur à ce stade, les tentatives de compilation échouent pour les raisons indiquées par l'OP (à savoir, fichiers manquants portant le même nom mais avec un préfixe "." Dans le dossier DerivedData).
Si vous créez manuellement les sous-classes NSManagedObject après avoir créé votre modèle sans utiliser la génération automatique apparemment bogue de Xcode, aucun problème ne survient. Un peu plus de frappe mais beaucoup plus fiable! Cependant, vous devrez commencer par un projet "propre" (c'est-à-dire avant de tenter de générer automatiquement les sous-classes), sinon l'erreur persiste. Le nettoyage des données dérivées n’aidera malheureusement pas.
***** MISE À JOUR ***** Il semble y avoir quelque chose d'assez étrange et il semble y avoir une génération de code silencieuse telle que suggérée à l'origine (excuses), mais il s'agit d'un comportement très différent de celui auquel on pourrait s'attendre . De plus, ce code n'est pas visible dans l'éditeur (ce qui semble un peu inutile et déroutant). Il est créé dans un sous-dossier DerivedData> Build> Intermediates> .Build.
Je comprends tout à fait pourquoi le PO était confus (comme ce fut le cas pour moi!). Ce qui en vaut la peine, c’est sans aucun doute une tentative d’aide, mais un peu déroutant si vous êtes habitué à un comportement antérieur et qu’on vous propose une option pour générer une copie visible et modifiable dans le menu principal.
Sélectionnez donc «Manuel/Aucun» dans la fenêtre de Codegen (voir ci-dessous), puis vous pourrez soit utiliser l’option de génération automatique de la barre de menus (après avoir supprimé le «courrier indésirable»), soit écrire votre propre code.
Suivez ces étapes,
Désactivez la génération automatique pour chaque entité individuellement en définissant Le paramètre "Codegen" sur "Manuel/Aucun" pour l'entité.
Remplacez le nom de l’entité par un autre élément à sauvegarder. Par exemple, changez le nom de la classe. construire; changer le nom de la classe en arrière; construire à nouveau.
J'ai eu cette erreur,
il suffit de changer la version de l'outil en Xcode 7.3 dans votre fichier .xcdatamodeld
et ça marche bien!
Après avoir essayé quelques réponses postées, le redémarrage de ma machine a fonctionné pour moi.
Tom Harrington La réponse est correcte. Cependant, il existe un moyen d'ajouter vos propres fonctions et/ou vars sans utiliser aucune des deux options mentionnées.
Juste créez une extension de la classe . (Assurez-vous de nommer le fichier Swift avec un nom différent de celui des fichiers NSManagesObject générés automatiquement.)
Par exemple. Si vous avez une entité appelée MyEntity
, vous pouvez ajouter un fichier Swift appelé MyEntityExtension.Swift
qui pourrait ressembler à ceci:
import Foundation
import CoreData
import UIKit
extension MyEntity {
var color: UIColor {
get {
return self.colorValue as! UIColor
}
set {
if newValue.isMember(of: UIColor.self) {
self.colorValue = newValue
}
}
}
}
Pour tous ceux qui ont du mal à faire fonctionner autogen:
Je devais définir "com.Apple.syncservices.Syncable" sur "NON" dans les paramètres d'informations utilisateur pour l'entité.
Peut-être que ça aide.
Supprimez les données de base du fichier de compilation dans la section "phases de construction" de l'onglet "source de compilation" appuyées -