Pregunta

Estoy bastante seguro de que me estoy perdiendo el punto aquí y me estoy confundiendo. ¿Alguien puede decirme cómo podría escribir una descripción simple de un objeto que imprima el valor de sus variables de instancia en la consola?

Además: ¿hay alguna forma de presentar la información como un bloque (es decir, si tuvieras 10 iVars, será un dolor hacer que todos regresen uno por uno)

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

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

saludos -gary-

¿Fue útil?

Solución

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

Otros consejos

Mira la respuesta a esta pregunta . El código se reproduce a continuación:

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);

Como Jason escribió, debería usar stringWithFormat: para formatear cadenas con sintaxis como printf.

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

Para evitar escribir esto una y otra vez para muchas clases, puede agregar una categoría en NSObject que le permita inspeccionar fácilmente las variables de instancia. Este será un mal rendimiento, pero funciona con fines de depuración.

@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

Con esto en su lugar, la descripción de implementación también es pan comido:

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

No agregue esta descripción como una categoría en NSObject, o podría terminar con infinitas recurrencias.

Eso no es una mala idea de lo que tenías allí, es casi posible también.

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

...

- (NSString *) description
{
    return _f(@"Name: %@ Mass: %d", bodyName, bodyMass);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top