Если тип объектов в коллекции известен, следует ли указывать тип итерационной переменной при использовании быстрого перечисления? - PullRequest
0 голосов
/ 22 января 2011

Например, скажем, у меня есть 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...
}

Ответы [ 2 ]

0 голосов
/ 22 января 2011

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

0 голосов
/ 22 января 2011

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

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

...