2009-04-02 5 views

Répondre

3

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.

+0

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? –

+0

consultez le lien cocoadev que j'ai ajouté, ou le chapitre 10 de Cocoa Programming pour Mac OS X par Hillegass (3ème édition) –

3

de Objective-C support "objet comme dictionnaire" vient par Key-Value Coding:

NSArray *myAttributes; // Assume this exists 
NSDictionary *dictRepresentation = [object dictionaryWithValuesForKeys:myAttributes]; 
+0

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? –

+0

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

+0

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

1

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.

Questions connexes