L'objet en question est constitué de paires clé/valeur, c'est-à-dire de @property. Existe-t-il un moyen élégant de coder/décoder cet objet en un dictionnaire ? Il semble que la force brute consiste à extraire manuellement chaque attribut et à créer le dictionnaire à la main.
Réponses
Trop de publicités?La prise en charge par Objective-C de l'utilisation d'un objet en tant que dictionnaire fait son apparition. Codage clé-valeur :
NSArray *myAttributes; // Assume this exists
NSDictionary *dictRepresentation = [object dictionaryWithValuesForKeys:myAttributes];
Faut-il absolument que ce soit un dictionnaire ? Parce que NSKeyedArchiver
vous donne le comportement du memento stocké par clé sans être réellement un NSDictionary
- et présente l'avantage supplémentaire de pouvoir archiver de nombreux objets que la sérialisation par liste de propriétés ne prend pas automatiquement en charge. Il existe une bonne description de utilisation d'archiveurs et de désarchiveurs sur le wiki CocoaDev.
Si les clés que vous désirez sont des propriétés ObjC-2.0 de la classe en question, vous pourriez faire quelque chose de similaire à 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
Il pourrait également s'agir d'une simple extension de classe.