2016-06-26 8 views
0

Я проверяю, что первая буква строки равна 0, если она удаляется и вызывается снова, чтобы проверить, есть ли еще 0. Я отлаживал это, и кажется, что когда он достигает числа без 0, он идет назад. Код:Рекурсивный метод Objective-C

-(NSString *)deleteZerosOnFirst:(NSString *)card 
{ 
    NSString *firstLetter = [card substringToIndex:1]; 
    if ([firstLetter isEqualToString:@"0"]) { 
     card = [card substringFromIndex:1]; 
     [self deleteZerosOnFirst:card]; 
     NSLog(@"CARD: %@", card); 
     return card; 
    } 
    else { 
     NSLog(@"CARD: %@", card); 
     return card; 
    } 

} 
+0

Разве это не только вопрос об использовании для цикла? Зачем вам нужно рекурсивно? –

+0

Не могли бы вы дать мне подсказку, как это сделать? Он должен повторять до тех пор, пока не будет выполнено условие, когда 0 не является первым символом. – Stefan

+0

Вы не комбинируете результаты рекурсии в любом месте. Результатом первого вызова всегда является только исходный аргумент минус один начальный '@" 0 "'. И что вы подразумеваете под «назад»? –

ответ

3

Вот ваш рекурсивный вызов:

[self deleteZerosOnFirst:card]; 

Это не изменяет строку, card ссылки. Он создает и возвращает новую строку. Вы игнорируете возвращаемую строку. Вы хотите:

card = [self deleteZerosOnFirst:card]; 

Но это на самом деле намного проще:

@implementation NSString (withoutLeadingZeroes) 

- (NSString *)withoutLeadingZeroes { 
    NSString *s = self; 
    while ([s hasPrefix:@"0"]) { 
     s = [s substringFromIndex:1]; 
    } 
    return s; 
} 

@end 
+0

Эй, Роб, ваш упрощенный метод должен быть в категории, или вы можете добавить его в любой файл .m, который вам нравится? –

+0

Вы можете реализовать его как метод для любого класса или как бесплатную функцию, но он имеет наибольший смысл в качестве категории. –

3

Основная проблема заключается в том, что вы не используете результат рекурсии. Строка кода, где вы называете себя должен сказать следующее:

card = [self deleteZerosOnFirst:card]; 

Кроме того, вы звоните deleteZerosOnFirst, прежде чем сделать NSLog. Отмените порядок этих двух линий. Это, по крайней мере, даст вам результат отладки в правильной последовательности.

Смежные вопросы