Dans Swift 2, le code suivant fonctionnait:
let request = NSFetchRequest(entityName: String)
mais dans Swift 3, cela donne une erreur:
Le paramètre générique "ResultType" n'a pas pu être déduit
parce que NSFetchRequest
c'est maintenant un type générique. Dans leurs documents, ils ont écrit ceci:
let request: NSFetchRequest<Animal> = Animal.fetchRequest
donc si ma classe de résultat est par exemple Level
comment dois-je demander correctement?
Parce que cela ne fonctionne pas:
let request: NSFetchRequest<Level> = Level.fetchRequest
let request: NSFetchRequest<Level> = Level.fetchRequest()
let request = Level.fetchRequest()
Réponses:
ou
selon la version que vous souhaitez.
Vous devez spécifier le type générique car sinon, l'appel de méthode est ambigu.
La première version est définie pour
NSManagedObject
, la deuxième version est générée automatiquement pour chaque objet utilisant une extension, par exemple:Le but est de supprimer l'utilisation des constantes String.
la source
Type 'Project Name' does not conform to protocol 'NSFetchRequestResult'
Je pense que je l'ai fait fonctionner en faisant ceci:
au moins, il enregistre et charge les données de DataBase.
Mais il semble que ce n'est pas une solution appropriée, mais cela fonctionne pour le moment.
la source
La structure la plus simple que j'ai trouvée et qui fonctionne dans la version 3.0 est la suivante:
où le type d'entité de données est le pays.
En essayant de créer un Core Data BatchDeleteRequest, cependant, j'ai trouvé que cette définition ne fonctionne pas et il semble que vous devrez utiliser le formulaire:
même si les formats ManagedObject et FetchRequestResult sont supposés être équivalents.
la source
if #available(iOS 10.0) { ... }
conditionnelVoici quelques méthodes CoreData génériques qui pourraient répondre à votre question:
En supposant qu'il existe une configuration NSManagedObject pour Contact comme ceci:
Ces méthodes peuvent être utilisées de la manière suivante:
la source
NSManagedObjectID
. Donc, avant d'context.delete(record)
ajouterlet record = context.object(with: record.objectID)
et d'utiliser cet objet d'enregistrement pour supprimer.C'est le moyen le plus simple de migrer vers Swift 3.0, il suffit d'ajouter
<Country>
(testé et travaillé)
la source
J'ai également eu "ResultType" ne pouvait pas être des erreurs déduites. Ils ont été effacés une fois que j'ai reconstruit le modèle de données en définissant Codegen de chaque entité sur "Définition de classe". J'ai fait un bref résumé avec des instructions étape par étape ici:
Vous recherchez un tutoriel clair sur le NSPersistentContainer révisé dans Xcode 8 avec Swift 3
Par «reconstruit», je veux dire que j'ai créé un nouveau fichier de modèle avec de nouvelles entrées et attributs. Un peu fastidieux, mais ça a marché!
la source
Ce qui a fonctionné le mieux pour moi jusqu'à présent était:
la source
J'ai eu le même problème et je l'ai résolu avec les étapes suivantes:
Après cela, j'ai dû supprimer / réécrire toutes les occurrences de fetchRequest car XCode semble en quelque sorte se mélanger avec la version générée par le code.
HTH
la source
Swift 3.0 Cela devrait fonctionner.
la source