Помогите с методом манипуляции со строками - PullRequest
1 голос
/ 16 апреля 2011

У меня есть метод с именем getTitle, который находится в категории NSString, и он будет удалять что-либо между строками "(" и ")", а также будет удалять эти строки.Однако, когда входная строка не содержит ни одной из приведенных выше строк, метод завершится с ошибкой:

* Завершение работы приложения из-за необработанного исключения «NSRangeException», причина: «*- [NSArray objectAtIndex:]: индекс 1 за пределами [0 .. 0] '

Это вызвано тем, что NSArray' a 'не имеет объектов.

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

- (NSString *)getTitle {
    NSArray *a = [self componentsSeparatedByString:@"("];
    if ([a count] > 0) {
        if ([a objectAtIndex:1] != [NSNull null])  {
        NSString *b = [a objectAtIndex:1];
        NSArray *c = [b componentsSeparatedByString:@")"];
        if ([c count] == 0)
            return self;
        if ([a objectAtIndex:0] != nil && [c objectAtIndex:1] !=nil)
            return [[[a objectAtIndex:0] stringByAppendingString:[c objectAtIndex:1]] stringByReplacingOccurrencesOfString:@"  -" withString:@" -"];
        else 
            return self;
        }
            else
                return self;
    }
    else {
        return self;
    }
    return self;
}

Ответы [ 3 ]

0 голосов
/ 16 апреля 2011

Хм .. звучит как строка как: @"foo(". В этом случае массив будет содержать только @"foo" и произойдет сбой (потому что count> 0, но не 2!). Вам нужно проверить, содержит ли массив хотя бы 2 элемента, прежде чем обращаться ко второму элементу в if ([a objectAtIndex:1] != [NSNull null]) {

0 голосов
/ 16 апреля 2011

Вы можете сделать что-то вроде этого:

NSString *str = @"asdf(asdf)asdf";
    NSRange range;
    range = [str rangeOfString:@"("];
    if( range.location != NSNotFound ){
        int start = range.location;
        range = [str rangeOfString:@")"];
        if( range.location!= NSNotFound ){
            int end = range.location;
            NSLog(@"%@",[NSString stringWithFormat:@"%@%@",[str substringToIndex:start],[str substringFromIndex:end+1]]);
        }
        // return nil;
    }
0 голосов
/ 16 апреля 2011

Возможно, в этой строке происходит сбой:

if ([a objectAtIndex:1] != [NSNull null])  {

Я полагаю, вы пытаетесь проверить, вернул ли componentsSeparatedByString: массив с более чем одним компонентом.Правильный способ - проверить if ([a count] > 1) (или >= 2).

...