5

Est-il possible d'utiliser l'énumération rapide avec un NSArray contenant un NSDictionary?Énumération rapide avec un NSMutableArray qui contient un NSDictionary

Je suis en cours d'exécution à travers quelques tutoriels Objective C, et le code suivant kicks la console en mode GDB

NSMutableArray *myObjects = [NSMutableArray array]; 
NSArray *theObjects = [NSArray arrayWithObjects:@"easy as 1",@"easy as two", @"Easy as Three"]; 
NSArray *theKeys = [NSArray arrayWithObjects:@"A",@"B",@"C"];  
NSDictionary *theDict = [NSDictionary dictionaryWithObjects:theObjects forKeys:theKeys]; 
[myObjects addObject:theDict]; 

for(id item in myObjects) 
{ 
    NSLog(@"Found an Item: %@",item); 
} 

Si je remplace la boucle d'énumération rapide avec une boucle de comptage classique

int count = [myObjects count]; 
for(int i=0;i<count;i++) 
{ 
    id item; 
    item = [myObjects objectAtIndex:i]; 
    NSLog(@"Found an Item: %@",item); 
} 

L'application s'exécute sans accident, et le dictionnaire est sorti dans la fenêtre de la console.

Est-ce une limitation de l'énumération rapide, ou est-ce que je manque un peu de la langue? Y a-t-il d'autres pièges lors de l'imbrication de collections comme celle-ci?

Pour les points bonus, comment ai-je pu utiliser GDB pour le déboguer moi-même?

Répondre

10

Oups! arrayWithObjects: doit être terminée à zéro. Le code suivant fonctionne très bien:

NSMutableArray *myObjects = [NSMutableArray array]; 
NSArray *theObjects = [NSArray arrayWithObjects:@"easy as 1",@"easy as two", @"Easy as Three",nil]; 
NSArray *theKeys = [NSArray arrayWithObjects:@"A",@"B",@"C",nil];  
NSDictionary *theDict = [NSDictionary dictionaryWithObjects:theObjects forKeys:theKeys]; 
[myObjects addObject:theDict]; 

for(id item in myObjects) 
{ 
    NSLog(@"Found an Item: %@",item); 
} 

Je ne sais pas pourquoi l'aide d'une boucle traditionnelle a caché cette erreur.

+0

Ah, un de mes Cisms préférés. "La chose que vous pensiez fonctionner correctement n'aurait pas dû être". Merci pour le conseil des novices! –

+3

Si vous activez -Wformat ("Typecheck appelle printf/scanf" dans Xcode), le compilateur en avertira. Si vous activez également -Werror ("Traiter les avertissements comme des erreurs" dans Xcode), le compilateur échouera la compilation sur cette erreur. –

+0

Merci Peter, très utile! –

Questions connexes