سؤال

وأنا متأكد أنا مجرد عداد المفقودين نقطة هنا والحصول على الخلط. يمكن لأحد أن يقول لي كيف يمكن كتابة وصف بسيط لكائن من شأنها أن طباعة قيمة المتغيرات المثال لوحدة التحكم.

وأيضا: هناك على أية حال لعرض البيانات على شكل كتلة (أي إذا كان لديك 10 إيفارس لها سوف يكون الألم الحصول على كل منهم للعودة واحدا تلو الآخر)

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

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

وهتافات -gary -

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

وانظر إلى الإجابة على <لأ href = "https://stackoverflow.com/questions/1213901/how-do-i-list-all-instance-variables-of-a-class-in-objective-c "> هذا السؤال . ويرد رمز أدناه:

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

وكما كتب جيسون يجب عليك استخدام stringWithFormat: لسلاسل التنسيق مع printf مثل تركيب

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

لتجنب كتابة هذا مرارا وتكرارا للعديد من الفئات التي يمكن أن تضيف فئة على NSObject التي تسمح لك لتفقد المتغيرات المثال بسهولة. وسوف يكون هذا الأداء السيئ، ولكنها تعمل لأغراض التصحيح.

@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

ومع وضع هذا في مكان تنفيذ وصف هو أيضا قطعة من الكعكة:

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

لا تقم بإضافة هذه description كفئة على NSObject، أو قد ينتهي بك الأمر مع recursions لانهائية.

وهذه ليست فكرة سيئة ما كان هناك، انها يمكن تحقيقه تقريبا أيضا.

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

...

- (NSString *) description
{
    return _f(@"Name: %@ Mass: %d", bodyName, bodyMass);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top