2011-01-22 2 views
0

Например, скажем, у меня есть NSArray, который содержит кучу NSString объектов:Если тип объектов в коллекции известен, должен ли я указывать тип переменной итерации при использовании быстрого перечисления?

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

Каковы плюсы и минусы сделать это:

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... 
} 

против:

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... 
} 

ответ

0

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

Итак, в вашем случае я бы сделал это, потому что вы вызываете -length (метод NSString) на каждый объект. Чтобы избежать предупреждений компилятора, вы должны передать объект определенному типу - то, что NSFastEnumeration делает для вас, когда вы укажете тип не id. Так что да, используйте свой второй пример.

0

Вы не можете сделать итератор универсальным, указав его тип id, если вы уже передали ему специальное сообщение. Если вы хотите сделать его «почти» универсальным, вы можете указать в качестве типа итератора самый высокий класс в иерархии, имеющий все сообщения, которые вы планируете использовать. Для вашего случая этот класс - NSString