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:
@dynamic
dans Objective-C (ce que je ne connais pas beaucoup)PFObject
du Parse SDK
. Il utilise normalement KVC pour lire/écrire des valeurs depuis/vers le backend.@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, @NSManaged
magiquement 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.
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
Dans le docs Apple , pour la classe d'objets gérés personnalisée, ils citent des propriétés telles que ... 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.
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.