/ / за обект в събирането, където обект наследява - цел-c, синтаксис, foreach, езикови характеристики

за обект в колекцията, където обект наследява - цел-c, синтаксис, foreach, езикови характеристики

В цел-в е

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.