Как мне создать хороший метод описания, который рекурсивно вложен как NSArray - PullRequest
1 голос
/ 16 мая 2009

Метод -description для NSArray будет вкладывать рекурсивные вызовы, как в:

2009-05-15 14:28:09.998 TestGUIProject[29695:813] (
    a, // Array1 item 1
        ( // Array2, a second array, nicely indented another 4 spaces
        a // Item in Array2
    ) // End of Array2
) // End of Array1

Я хочу сделать что-то подобное для своих собственных классов (используя скрипт, который я пишу).

Чего я не знаю, так это как добавить дополнительный уровень отступа, когда рекурсивно вызываемый объект добавляет новые собственные строки.

У меня есть следующее:

- (NSString *)description {
    return [NSString stringWithFormat:@"{{{\n"
            @"    prop1: %@\n"
            @"    prop2: %@\n"
            @"    prop3: %@\n"
            @"    prop4: %@\n"
            @"}}}",
            self.prop1,
            self.prop2,
            self.prop3,
            self.prop4];
}

Но это выходит из строя, как только одно из свойств представляет собой NSArray или другой объект, использующий тот же формат описания, потому что он плохо вкладывается.

Вместо этого вы получаете:

2009-05-15 14:25:50.899 TestApp[29636:813] {{{
    prop1: SomeValue1
    prop2: ( // Prop 2 is an Array of strings
    "String1", // Note no additional level of indentation as in the NSArray example
    "String2",
    "String3",
    "String4"
)
    prop3: SomeValue3
    prop4: SomeValue4
}}}

Как мне получить дополнительные уровни вложенности?

Ответы [ 3 ]

8 голосов
/ 16 мая 2009

Вам нужна эта функция, доступная в NSArray и NSDictionary:

- (NSString *) descriptionWithLocale: (id) locale indent: (NSUInteger) level;

Укажите отступ 1, чтобы вложенный массив или словарь делали отступ для всего, что он печатает, на указанное количество.

1 голос
/ 16 мая 2009

Это на самом деле работает для моих целей:

[[self.prop2 description] stringByReplacingOccurrencesOfString:@"\n" withString:@"\n    "]
0 голосов
/ 16 мая 2009

Возможно, вам придется отказаться от использования description в NSArray. Возможно, вам следует написать метод для перебора массива и отступа при необходимости самостоятельно при добавлении в NSString. Возможно, вам придется использовать NSMutableString и передать его, чтобы к нему можно было добавить строки.

Редактировать

На основании вашего комментария я бы тогда сказал, что используйте методы objc_* для отражения того, какой объект был передан вашему методу отладки. Оттуда вы можете извлекать все свойства или переменные экземпляра и перебирать их. Вы также можете использовать условное выражение для проверки типа ивара, и, если это стандартный класс коллекции, такой как NSArray или NSDictionary, выполните итерацию по нему самостоятельно, чтобы вывести данные в нужном формате (и, конечно, обработать другие типы объектов и все примитивы по-своему).

...