/ / per l'oggetto nella raccolta in cui l'oggetto eredita - obiettivo-c, sintassi, foreach, caratteristiche della lingua

per oggetto in collezione dove l'oggetto eredita - obiettivo-c, sintassi, foreach, caratteristiche linguistiche

In obiettivo-c, è

for (Foo *foo in fooList) ...

più come quale dei seguenti

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

risposte:

2 per risposta № 1

Non è come entrambi.

Il tipo di foo nel for() parte è solo un suggerimento per il compilatore, quindi puòdare i messaggi di errore rilevanti. In fase di esecuzione, tutti gli oggetti sono solo oggetti e fintanto che tutti implementano i metodi utilizzati nel blocco, non ci saranno errori. Per esempio:

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

itererà su tutti gli oggetti nella matrice e invierà intValue a ciascuno non importa di che tipo siano inclusa la NSString alla fine. Se ogni oggetto implementa intValue funzionerà bene (come fa NSString). Se c'è un oggetto nell'array che non implementa intValue, molto probabilmente verrà lanciata un'eccezione.


2 per risposta № 2

Se capisco correttamente, mi stai chiedendo se for (Foo *foo in fooList) itererà sopra il sottoinsieme di elementi in fooList che sono membri di classe Foo o il sottoinsieme di elementi che sono tipo di classe Foo.

La risposta è: Nessuna. L'enumerazione veloce (per ... in) verrà iterata su tutti gli articoli della collezione. Lo farà non filtra gli oggetti di tipo Foo.