Objective-C уродливый код? - PullRequest
0 голосов
/ 06 июля 2011

У меня есть код Objective-C, который выполняет эту работу за меня.Но это некрасиво (неэффективно).Можно ли выполнить его лучше для циклов for-each?

См. Этот код, пожалуйста:

for (int i = 0; i < [careerIds count]; i++) {

    NSString *titleString = [[titles objectAtIndex:i] stringValue];
    if ([titleString isEqualToString:@""] || [titleString rangeOfString:@"Intresseanmälan"].location != NSNotFound) {
        // Don't add the id
    } else {
        [ids addObject:[[careerIds objectAtIndex:i] stringValue]];
    }

}

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

Я не думаю, что код, который у вас есть, особенно уродлив - нет ничего плохого в том, чтобы использовать индексированный цикл for, как вы уже сделали.Единственное, что я мог бы изменить, это инвертировать смысл оператора if, чтобы избежать пустой строки // Don't add the id.Вот один из способов:

for (int i = 0; i < [careerIds count]; i++) {

    NSString *titleString = [[titles objectAtIndex:i] stringValue];

    if (([titleString length] > 0) && 
        ([titleString rangeOfString:@"Intresseanmälan"].location == NSNotFound))
    {
        [ids addObject:[[careerIds objectAtIndex:i] stringValue]];
    }

}

Чтобы понять суть вашего вопроса, нет, я не верю, что можно использовать версию с быстрым перечислением цикла for для перебора содержимого двухотдельные контейнеры одновременно.Вы можете использовать его с одним, но, как я указал в комментарии, вам нужно будет использовать -indexOfObject:, чтобы восстановить индекс текущего объекта, чтобы вы могли получить соответствующий элемент из другого массива, используя -objectAtIndex:.

0 голосов
/ 06 июля 2011

Предполагая, что careerIds является NSArray или NSMutableArray, и что вы добавляете в него объекты NSString, вы можете сделать это:

for (NSString *titleString in careerIds) {

    if ([titleString isEqualToString:@""] || [titleString rangeOfString:@"Intresseanmälan"].location != NSNotFound) {
        // Don't add the id
    } else {
        [ids addObject: titleString];
    }
}

[ids addObject: [[careerIds objectAtIndex: i] stringValue]];

0 голосов
/ 06 июля 2011

Можно ли сделать это лучше для циклов for-each?

Да.

for (id title in careerIds) {

    NSString *titleString = [title stringValue];
    if ([titleString isEqualToString:@""] || [titleString rangeOfString:@"Intresseanmälan"].location != NSNotFound) {
        // Don't add the id
    } else {
        [ids addObject:titleString];
    }
}

Или, если вы хотите быть действительно флеш:

for (NSString* titleString in [careerIds valueForKey: @"stringValue"]) {

    if ([titleString isEqualToString:@""] || [titleString rangeOfString:@"Intresseanmälan"].location != NSNotFound) {
        // Don't add the id
    } else {
        [ids addObject:titleString];
    }
}

Нет. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...