Objective-C丑陋的代码?

时间:2011-07-06 10:17:57

标签: objective-c performance for-loop

我有一些Objective-C代码可以帮我完成工作。但它是否丑陋(效率低下)。对于每个循环,它可以更好地执行吗?

请参阅此代码:

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 个答案:

答案 0 :(得分:2)

我认为你所拥有的代码并不特别难看 - 使用索引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:来恢复当前对象的索引,以便您可以使用{{1}从另一个数组中获取相应的项目}}

答案 1 :(得分:0)

  

使用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];
    }
}

没有。 : - )

答案 2 :(得分:0)

假设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]];