2010-10-01 9 views
0

Je souhaite copier des éléments d'un tableau qui ne sont pas 0 ou @ "" (selon NSNumber ou NSString). Le code suivant, cependant, ne fonctionne pas. Qu'est-ce que je fais mal?Remplir conditionnellement un tableau d'un autre tableau - objectifC

for (int i=0; i < [logbookItems count]; i++) { 
    NSLog(@"%@, %@, %@", [[[logbookItems objectAtIndex:i] objectAtIndex:1] class], [[logbookItems objectAtIndex:i] objectAtIndex:0], [[logbookItems objectAtIndex:i] objectAtIndex:1]); 
    if ((([[[logbookItems objectAtIndex:i] objectAtIndex:1] isKindOfClass:[NSNumber class]]) && ([[logbookItems objectAtIndex: i] objectAtIndex: 1] > 0)) 
     || (([[[logbookItems objectAtIndex:i] objectAtIndex:1] isKindOfClass:[NSString class]]) && ([[logbookItems objectAtIndex: i] objectAtIndex: 1] != @""))) { 
     [visibleLogbookItems addObject: [logbookItems objectAtIndex: i]]; 
    } 
} 

Il produit le journal suivant:

2010-10-01 12:46:48.301 PilotsMate[1750:207] (
21, 
10, 
1985, 
"Test AC Mark", 
"", 
"", 
"", 
"Test Mission", 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0, 
0 
) 
2010-10-01 12:46:52.996 PilotsMate[1750:207] NSCFNumber, Day: , 21 
2010-10-01 12:46:52.997 PilotsMate[1750:207] NSCFNumber, Month: , 10 
2010-10-01 12:46:52.997 PilotsMate[1750:207] NSCFNumber, Year: , 1985 
2010-10-01 12:46:52.998 PilotsMate[1750:207] NSCFString, Aircraft Type: , Test AC Mark 
2010-10-01 12:46:52.998 PilotsMate[1750:207] NSCFString, Airframe Number: , 
2010-10-01 12:46:52.999 PilotsMate[1750:207] NSCFString, Pilot: , 
2010-10-01 12:46:53.000 PilotsMate[1750:207] NSCFString, Crew: , 
2010-10-01 12:46:53.000 PilotsMate[1750:207] NSCFString, Mission: , Test Mission 
2010-10-01 12:46:53.001 PilotsMate[1750:207] NSCFNumber, Pilot Hours (Day): , 0 
2010-10-01 12:46:53.002 PilotsMate[1750:207] NSCFNumber, Crew Hours (Day): , 0 
2010-10-01 12:46:53.002 PilotsMate[1750:207] NSCFNumber, Pilot Hours (Night): , 0 
2010-10-01 12:46:53.003 PilotsMate[1750:207] NSCFNumber, Crew Hours (Night): , 0 
2010-10-01 12:46:53.004 PilotsMate[1750:207] NSCFNumber, Simulator Hours: , 0 
2010-10-01 12:46:53.005 PilotsMate[1750:207] NSCFNumber, IF Simulated: , 0 
2010-10-01 12:46:53.006 PilotsMate[1750:207] NSCFNumber, IF Actual: , 0 
2010-10-01 12:46:53.006 PilotsMate[1750:207] NSCFNumber, No. of SRA: , 0 
2010-10-01 12:46:53.008 PilotsMate[1750:207] NSCFNumber, No. of PAR: , 0 
2010-10-01 12:46:53.009 PilotsMate[1750:207] NSCFNumber, No. of ILS: , 0 
2010-10-01 12:46:53.020 PilotsMate[1750:207] NSCFNumber, No. of GPS: , 0 
2010-10-01 12:46:53.023 PilotsMate[1750:207] NSCFNumber, No. of SCA: , 0 
2010-10-01 12:46:53.024 PilotsMate[1750:207] NSCFNumber, No. of ELVA: , 0 
2010-10-01 12:46:53.025 PilotsMate[1750:207] NSCFNumber, DL (Day): , 0 
2010-10-01 12:46:53.028 PilotsMate[1750:207] NSCFNumber, DL (Night - Conventional): , 0 
2010-10-01 12:46:53.030 PilotsMate[1750:207] NSCFNumber, DL (Night - NVG): , 0 
2010-10-01 12:46:53.030 PilotsMate[1750:207] NSCFNumber, GFP: , 0 
2010-10-01 12:46:53.031 PilotsMate[1750:207] NSCFNumber, IFP: , 0 
2010-10-01 12:46:53.032 PilotsMate[1750:207] NSCFNumber, NVG: , 0 
2010-10-01 12:46:53.032 PilotsMate[1750:207] NSCFNumber, RNFA: , 0 
2010-10-01 12:46:53.033 PilotsMate[1750:207] NSCFNumber, Instructional Hours (Day): , 0 
2010-10-01 12:46:53.033 PilotsMate[1750:207] NSCFNumber, Instructional Hours (Night): , 0 

Répondre

1

Premier changement ceci:

([[logbookItems objectAtIndex: i] objectAtIndex: 1] != @"") 

à:

(![[[logbookItems objectAtIndex: i] objectAtIndex: 1] isEqualToString:@""] 
+0

Magie, j'avais oublié ça. J'ai toujours le problème avec les nombres 0 étant copiés dans le tableau cependant. Je dois faire quelque chose de mal, mais je ne peux pas trouver ce que ... –

+0

En fait j'irais pour '([[[logbookItems objectAtIndex: i] objectAtIndex: 1] longueur]! = 0)' – JeremyP

1

comparaisons de NSStrings à l'aide de l'égalité @"" sont pointeur efficacement des comparaisons. Ainsi, vous ne pouvez pas simplement utiliser someString != @"" pour comparer avec la chaîne vide. Au lieu de cela, utilisez isEqualToString: ou effectuez un test sur un zéro length.

Edit: Juste pour la lisibilité du code, si vous utilisez Objective C 2.0, vous pouvez remplacer votre boucle et la récupération d'objets par index avec un foreach ...

for (NSArray *logbookItem in logBookItems) { 
    NSLog(NSLog(@"%@, %@, %@", [[logBookItem objectAtIndex:1] class], ... 
+0

Merci, j'avais oublié cela. C'est maintenant beaucoup plus facile à lire! –

1

va de même pour le NSNumber, vous devez appeler intValue par exemple sur à comparer contre 0.

+0

Merci, bien que si il est stocké sous la forme d'un nombre entier/float, comme NSNumber, pourquoi ai-je encore besoin de la valeur integer/float lors d'une comparaison? –

+0

Il s'agit toujours d'un NSNumber, donc pour récupérer l'int/float que vous avez stocké, vous devez appeler intValue/floatValue. –

+0

Gotcha, merci. Il est dommage que vous ne pouvez pas choisir 2 réponses pour être correct, car les deux étaient pour les différentes parties. –

Questions connexes