Question

Je suis à peu près sûr que je manque le point ici et que je deviens confus. Quelqu'un peut-il me dire comment écrire une description simple pour un objet qui affichera la valeur de ses variables d'instance sur la console.

Aussi: y a-t-il un moyen de présenter l’information en bloc (c’est-à-dire que si vous aviez 10 iVars, ce serait difficile de les faire revenir tous un par un)

@interface CelestialBody : NSObject {
    NSString *bodyName;
    int bodyMass;
}

- (NSString *)description { 
    return (@"Name: %@ Mass: %d", bodyName, bodyMass);
}

cheers -gary -

Était-ce utile?

La solution

- (NSString*)description
{
  return [NSString stringWithFormat:@"Name: %@\nMass: %d\nFoo: %@",
     bodyName, bodyMass, foo];
}

Autres conseils

Regardez la réponse à cette question . Le code est reproduit ci-dessous:

unsigned int varCount;

Ivar *vars = class_copyIvarList([MyClass class], &varCount);

for (int i = 0; i < varCount; i++) {
    Ivar var = vars[i];

    const char* name = ivar_getName(var);
    const char* typeEncoding = ivar_getTypeEncoding(var);

    // do what you wish with the name and type here
}

free(vars);

Comme Jason l'a écrit, vous devez utiliser stringWithFormat: pour formater les chaînes avec la syntaxe printf.

-(NSString*)description;
{
  return [NSString stringWithFormat:@"Name: %@ Mass: %d", bodyName, bodyMass];
}

Pour éviter d'écrire ceci encore et encore pour de nombreuses classes, vous pouvez ajouter une catégorie sur NSObject qui vous permet d'inspecter facilement les variables d'instance. Ce sera une mauvaise performance, mais fonctionnera à des fins de débogage.

@implementation NSObject (IvarDictionary)

-(NSDictionary*)dictionaryWithIvars;
{
  NSMutableDictionary* dict = [NSMutableDictionary dictionary];
  unsigned int ivarCount;
  Ivar* ivars = class_copyIvarList([self class], &ivarCount);
  for (int i = 0; i < ivarCount; i++) {
    NSString* name = [NSString stringWithCString:ivar_getName(ivars[i])
                                        encoding:NSASCIIStringEncoding];
    id value = [self valueForKey:name];
    if (value == nil) {
      value = [NSNull null];
    }
    [dict setObject:value forKey:name];
  }
  free(vars);
  return [[dict copy] autorelease]; 
}
@end

Avec cette description d'application en place, c'est aussi un jeu d'enfant:

-(NSString*)description;
{
  return [[self dictionaryWithIvars] description];
}

N'ajoutez pas cette description en tant que catégorie sur NSObject. Vous pourriez vous retrouver avec une récurrence infinie.

Ce n’est pas une mauvaise idée de ce que vous aviez là-bas, c’est presque aussi réalisable.

// choose a short name for the macro
#define _f(x,...) [NSString stringWithFormat:x,__VA_ARGS__]

...

- (NSString *) description
{
    return _f(@"Name: %@ Mass: %d", bodyName, bodyMass);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top