web-dev-qa-db-fra.com

Que fait @NSManaged?

J'ai rencontré ce mot clé à diverses occasions. Je sais plus ou moins ce que c'est supposé faire. Mais je veux vraiment mieux comprendre. 

Ce que j'ai remarqué à propos de @NSManaged - basé non sur la documentation, mais par des utilisations répétées:

  1. Il remplace comme par magie le codage de la valeur clé. 
  2. C'est à peu près l'équivalent de @dynamic dans Objective-C (ce que je ne connais pas beaucoup)
  3. J'en ai besoin de la sous-classe PFObject du Parse SDK. Il utilise normalement KVC pour lire/écrire des valeurs depuis/vers le backend.
  4. Si vous préfixez une variable avec @NSManaged, le compilateur sera fermé si je n’initialise pas l’initialiseur. 

La définition formelle (dans les documents de base de données Apple):

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é, ce 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 la mise en œuvre d'une propriété seront fournis au moment de l'exécution. Cependant, contrairement à @dynamic, l'attribut @NSManaged est disponible uniquement pour la prise en charge de Core Data.

Ce que j'en tire:

Les variables avec @NSManaged seront exemptes des vérifications de temps de compilation pour quelque chose.

J'ai lu la documentation officielle et diverses SO questions à ce sujet:

@synthesize vs @dynamic, quelles sont les différences?

Quel est le cas habituel pour l'utilisation @dynamic?

Je reconnais instinctivement certains scénarios où je devrais l'utiliser. Je partiellement sais ce que ça fait. Mais ce que je cherche, c’est une compréhension plus pure de ce qu’il fait. 

Observations supplémentaires:

Une PFObject dans Parse SDK s'appuie sur Key Value Coding pour accéder à ses valeurs. La PFObject fournit les accesseurs suivants:

objectForKey: 

let score = results.objectForKey("descriptionOfResult") 
//returns the descriptionOfResult value from the results object

setObject:forKey:

results.setObject("The results for a physics exam", forKey: "descriptionOfResult") 
//sets the value of descriptionOfResult 

Si j'ai bien compris, @NSManagedmagiquement comprend que la variable que j'ai déclarée utilise automatiquement les accesseurs ci-dessus pour get et set. J'aimerais savoir comment cela fonctionne (si ce que je comprends est vrai) et quoi que ce soit d'autre.

34
Kelvin Lau

Oui, cela ressemble vraiment à @dynamic - techniquement, il pourrait même être identique. Sémantiquement, il y a une légère différence:

@ Dynamique dit 'compilateur, ne vérifiez pas si mes propriétés sont également implémentées. Il n'y a peut-être aucun code que vous puissiez voir mais je vous garantis qu'il fonctionnera au moment de l'exécution '

@NSManaged indique maintenant 'Compilateur, ne cochez pas ces propriétés, car Core Data est en charge de la mise en œuvre. Elle sera disponible à l'exécution.'

vous pourriez même dire: @NSManaged est un sucre syntaxique qui est une version plus étroite de dynamique :)


https://github.com/KyoheiG3/DynamicBlurView/issues/2
Ici, quelqu'un a même utilisé @NSManaged sans CD car il souhaitait le comportement @dynamic

35
Daij-Djan

Dans le docs Apple , pour la classe d'objets gérés personnalisée, ils citent des propriétés telles que ...  enter image description here Pour moi, il semble qu'il n'y ait pas de différence, j'ai utilisé @dynamic dans l'Objectif C, il semble que @NSManaged soit le remplacement dans Swift. 

3
BangOperator

Les réponses mentionnées ci-dessus sont correctes. Voici ma compréhension.

@NSManaged indique que les variables obtiendront certaines valeurs lors de l'exécution de l'application. Coredata crée automatiquement un getter et un setter pour de tels accessoires. Il met le compilateur en sourdine pour les avertissements.

NSmanaged est la sous-classe de NSObject. @ NSManaged signifie que du code supplémentaire sera attribué à ces accessoires lors de l'exécution . Il suit les modifications apportées à ces propriétés.

0
iPhoneDeveloper