0

For example, say I have an NSArray that contains a bunch of NSString objects:

NSArray *games = [NSArray arrayWithObjects:@"Space Invaders", @"Dig Dug", @"Galaga", nil];

What are the pros and cons of doing this:

for (id object in games) {
    NSLog(@"The name of the game is: %@", object);
    NSLog(@"The name is %d characters long.", [object length]);
    // Do some other stuff...
}

versus:

for (NSString *name in games) {
    NSLog(@"The name of the game is: %@", name);
    NSLog(@"The name is %d characters long.", [name length]);
    // Do some other stuff...
}
Jacob Relkin
  • 161,348
  • 33
  • 346
  • 320
sys 64738
  • 197
  • 9

2 Answers2

0

It's not strictly necessary, and will force a cast to the specified type on every iteration, so unless you are calling methods specific to NSString inside of your loop, then I don't see why this could be beneficial.

So, in your case I would do it, because you're invoking -length (an NSString method) on every object. In order to avoid compiler warnings, you'd cast the object to the specific type - which is what NSFastEnumeration does for you when you specify a non-id type. So yeah, use your second example.

Jacob Relkin
  • 161,348
  • 33
  • 346
  • 320
0

You can't make iterator universal by specifying it's type as id if you've already passed a class specific message to it. If you want to make it "almost" universal you can specify as iterator's type the top-most class in hierarchy having all messages you plan to use. For your case this class is NSString

Martin Babacaev
  • 6,240
  • 2
  • 19
  • 34