для объекта в коллекции, где объект наследует - PullRequest
2 голосов
/ 14 июля 2011

В объективе-с

for (Foo *foo in fooList) ...

больше похоже на то, что из следующего

@interface Bar : Foo ...

for (Foo *f in fooList) {
    // A:
    if ([f isMemberOfClass:[Foo class]]) ... // dont include Bar's

    // B:
    if ([f isKindOfClass:[Foo class]]) ... // both Foos and Bars
}

Ответы [ 2 ]

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

Это не похоже ни на что.

Тип foo в части for() является лишь подсказкой для компилятора, поэтому он может выдавать соответствующие сообщения об ошибках.Во время выполнения все объекты являются просто объектами, и пока все они реализуют методы, используемые в блоке, ошибок не будет.Например:

NSString* aString = @"20";
[anArray addObject: aString];
for (NSNumber* foo in anArray)
{
    NSLog(@"%d", [foo intValue]);
}

будет перебирать все объекты в массиве и отправлять intValue каждому независимо от того, какого типа они , включая NSString в конце.Если каждый объект реализует intValue, он будет работать просто отлично (как NSString).Если в массиве есть объект, который не реализует intValue, скорее всего будет сгенерировано исключение.

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

Если я правильно понимаю, вы спрашиваете, будет ли for (Foo *foo in fooList) выполнять итерацию по подмножеству элементов в fooList, которые являются членами класса Foo, или подмножеству элементов, которые относятся к классу Foo.

Ответ: нет.При быстром перечислении (for ... in) будет выполняться итерация по всем элементам в коллекции .Он будет не фильтровать объекты типа Foo.

...