В цел-в е
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 за отговор № 1Тя не е като и двете.
Видът на foo
в for()
част е само намек за компилатора, така че можедайте съответните съобщения за грешка. По време на изпълнение, всички обекти са само обекти и докато всички те прилагат методите, използвани в блока, няма да има грешки. Например:
NSString* aString = @"20";
[anArray addObject: aString];
for (NSNumber* foo in anArray)
{
NSLog(@"%d", [foo intValue]);
}
ще итера над всички обекти в масива и ще изпрати intValue на всеки един от тях независимо от техния вид включително NSString в края. Ако всеки обект се реализира intValue
тя ще работи добре (както прави NSString). Ако има обект в масива, който не изпълнява intValue, най-вероятно ще бъде отхвърлено изключение.
2 за отговор № 2
Ако разбирам правилно, питате дали for (Foo *foo in fooList)
ще се повтаря над подгрупата на елементите в fooList
които са членове на класа Foo
или подгрупата от елементи, които са вид клас Foo
.
Отговорът е: Няма. Бързото изброяване (за ... in) ще се повтори всички елементи в колекцията, Това ще бъде не филтриране на обектите от типа Foo
.