2011-02-23 5 views
2

J'ai un tableau avec plusieurs objets et je veux ajouter 90.0 à chaque valeur. Je veux le faire en utilisant enumerate. Puis-je créer ceci:iPhone - énumération des blocs

[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent 
    usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

    double aValue = [obj doubleValue];      
    aValue += 90.0; 
    obj = [NSNumber numberWithDouble:aValue]; 
}]; 

ma question concerne la dernière ligne. Je reçois la valeur de l'objet, ajoute 90 et ensuite je dois le stocker. Comme c'est un peu bizarre, parce que je travaille sur le niveau de l'objet, je ne savais pas si la troisième ligne avait la syntaxe correcte pour stocker la valeur mise à jour sur l'objet. Xcode se plaint "obj" n'est jamais utilisé, car il pense que j'affecte le numéro à obj avec l'intention de l'utiliser, mais je ne fais que stocker la valeur.

Est-ce correct?

Répondre

1

Une meilleure façon serait de stocker les valeurs modifiées à un nouveau tableau:

NSMutableArray *newArray = [[NSMutableArray alloc] initWithCapacity:[myArray count]]; 
__block newArray; 
[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

double aValue = [obj doubleValue];      
aValue += 90.0; 
[newArray insertObject:[NSNumber numberWithDouble:aValue] atIndex:idx]; 
}]; 

Note J'ai tapé ce droit, donc s'il vous plaît excuser les erreurs de syntaxe.

+0

merci! Cela devrait résoudre le problème!!!! – SpaceDog

2

obj n'est pas une référence ou un pointeur, vous ne pouvez pas réellement le stocker. NSArray ne supporte pas cette fonctionnalité. Ce que vous pouvez faire, c'est au lieu de stocker NSNumbers, stocker des pointeurs sur NSNumber (c'est NSNumber **) et mettre à jour la référence à un nouvel objet.

Le stockage de vos numéros dans le tableau normal double[] fonctionnerait également.

+0

Vous pouvez uniquement énumérer des objets. le double n'est pas un objet. NSNumber est. –

+0

Je ne voulais pas dire qu'il serait en mesure d'énumérer sur eux via un message enumerate * régulier, je voulais simplement dire qu'il serait plus facile de mettre à jour chaque élément quand il est dans un tableau. – yan

+0

myArray est un NSMutableArray ... – SpaceDog

0

Si vous vouliez faire une opération en place, vous pouvez utiliser ceci:

[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
{ 
    double aValue = [obj doubleValue];      
    aValue += 90.0; 
    [myArray replaceObjectAtIndex:idx withObject:[NSNumber numberWithDouble:aValue]]; 
}]; 

Bien que NSMutableArray ne soit pas censé être threadsafe, qui est habituellement que si vous changez la taille de celui-ci. Travaillé bien dans un test simple, mais utilisez à vos risques et périls.

+0

Je l'ai fait avant, mais j'ai reçu une erreur disant que je ne peux pas changer un tableau qui est en cours d'énumération ... :( – SpaceDog