L'objet en question est constitué de paires clé/valeur nommées @property. Existe-t-il un moyen élégant d'encoder/décoder cet objet dans un dictionnaire? Il semble que la force brute pour retirer manuellement chaque attribut et créer le dictionnaire à la main.Quelle est la manière la plus élégante d'encoder/décoder un objet en dictionnaire?
Répondre
Est-il besoin absolument être un dictionnaire? Parce que NSKeyedArchiver
vous donne le comportement memento-stocké-par-clé sans être réellement un NSDictionary
- et a le bonus supplémentaire qu'il peut archiver de nombreux objets que la sérialisation de liste de propriétés ne prend pas automatiquement en charge. Il y a une bonne description de using archivers and unarchivers sur le wiki CocoaDev.
de Objective-C support "objet comme dictionnaire" vient par Key-Value Coding:
NSArray *myAttributes; // Assume this exists
NSDictionary *dictRepresentation = [object dictionaryWithValuesForKeys:myAttributes];
Hmm est [object attributeKeys]; http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/attributeKeys non disponible sur iphone? –
Je ne pense pas que ce soit. Mais il est d'une utilisation douteuse sur OS X de toute façon - une classe doit être spécifiquement écrite pour le faire fonctionner correctement. Key-Value Coding vous permet de traiter un objet comme un dictionnaire dans une certaine mesure, mais l'équivalence Object == Dictionary n'est pas aussi forte que, disons, Python ou Javascript. – Chuck
Vous pouvez le pirater en partie en utilisant les fonctions d'exécution Objective-C pour obtenir dynamiquement les propriétés de l'objet, mais dans la plupart des cas, cela n'en vaut pas la peine. – Chuck
Si les clés que vous désirez sont des propriétés ObjC-2.0 de la classe en question, vous pouvez faire quelque chose de semblable à ce qui suit:
// Assume MyClass exists
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList([myClassInstance class], &count);
NSMutableDictionary *propertiesDict = [NSMutableDictionary dictionary];
unsigned int i;
for(i = 0; i < count; ++i) {
NSString *propertyName = [NSString stringWithCString:property_getName(properties[i]) encoding:NSASCIIStringEncoding];
id propertyValue = [self valueForKey:propertyName];
if(propertyValue)
[propertiesDict setObject:propertyValue forKey:propertyName];
}
free(properties), properties = NULL;
// Do something with propertiesDict
Cela pourrait aussi être une simple extension de la classe.
- 1. Quelle est la manière la plus élégante de mapper une liste à une autre en Java?
- 2. Quelle est la manière la plus élégante de faire "foreach x sauf y" en PHP?
- 3. Quelle est la manière la plus élégante de mettre en œuvre GetTextAfterMarker()
- 4. Quelle est la manière la plus efficace/élégante de supprimer des éléments d'une matrice dans MATLAB?
- 5. MbUnit: La manière la plus élégante de comparer les doubles?
- 6. Quelle est la manière la plus élégante de transformer une variable que vous venez de recevoir en argument?
- 7. Quelle est la manière la plus élégante et la plus efficace de modéliser une hiérarchie d'objets de jeu? (Conception dérange)
- 8. Quelle est la manière la plus simple/élégante de calculer la longueur d'un nombre écrit en tant que texte?
- 9. La façon la plus élégante de convertir un tableau de chaînes en un dictionnaire de chaînes
- 10. Quelle est la manière la plus simple de se connecter à un objet serveur distant .NET
- 11. La manière la plus élégante d'interroger la chaîne XML en utilisant XPath
- 12. Quelle est la manière la plus élégante d'utiliser une vue partielle pour afficher un ensemble d'éléments délimités par des virgules?
- 13. Quelle est la manière la plus simple de faire 'est' en Java?
- 14. Quelle est la manière la plus élégante d'implémenter une règle métier relative à une collection enfant dans LINQ?
- 15. Quelle est la manière la plus simple d'ajouter un à une chaîne binaire en Perl?
- 16. Rails: Manière élégante de manipuler la navigation?
- 17. Quelle est la façon la plus élégante d'échanger les événements lors de la création d'une propriété?
- 18. Quelle est la manière la plus simple et la plus légère de créer un client-serveur en Perl?
- 19. Quelle est la manière la plus simple d'appeler l'URL HTTP POST en utilisant Delphi?
- 20. Quelle est la manière la plus sûre/appropriée d'implémenter un modèle singleton thread-safe?
- 21. Quelle est la manière la plus efficace d'implémenter ReadLine() sur un flux binaire?
- 22. Quelle est la manière la plus efficace de déplacer un UIImageView?
- 23. Quelle est la manière la plus simple de formater un .NET DateTime selon YYYYMMDD ou similaire?
- 24. Quelle est la manière la plus simple d'interagir entre un SAP OMS et Websphere Commerce?
- 25. Quelle est la manière la plus propre d'écrire une chaîne multiligne en JavaScript?
- 26. Quelle est la manière la plus simple de créer une carte d'identité STL?
- 27. Quelle est la manière la plus rapide/la plus simple de dénormaliser cette table hiérarchique en une table plate?
- 28. Quelle est la manière la plus simple de créer un tableau de structures?
- 29. Python Golf: quelle est la façon la plus concise de transformer cette liste des listes dans un dictionnaire:
- 30. Quelle est la plus élégante façon d'arrêter une fenêtre Winforms être déplacé autour
n'a pas besoin d'être un dictionnaire et vous évoquez un excellent point. Je ne pouvais pas trouver un excellent exemple de nskeyedarchiver - pouvez-vous lier un blog ou un extrait? –
consultez le lien cocoadev que j'ai ajouté, ou le chapitre 10 de Cocoa Programming pour Mac OS X par Hillegass (3ème édition) –