2 Stimmen

iPhone - Blockaufzählung

Ich habe ein Array mit mehreren Objekten und möchte zu jedem Wert 90,0 hinzufügen. Ich möchte dies mit enumerate tun. Dann erstelle ich dies:

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

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

Meine Frage bezieht sich auf die letzte Zeile. Ich erhalte den Objektwert, addiere 90 und muss ihn dann wieder speichern. Da dies ein wenig seltsam ist, weil ich auf der Objektebene arbeite, war ich nicht sicher, ob die dritte Zeile die richtige Syntax hat, um den aktualisierten Wert wieder auf dem Objekt zu speichern. Xcode beschwert sich, dass "obj" nie verwendet wird, weil es denkt, dass ich die Zahl zu obj mit der Absicht, es zu verwenden zuweisen, aber ich bin nur den Wert zurück zu speichern.

Ist dies richtig?

2voto

yan Punkte 20278

obj kein Verweis oder Zeiger ist, können Sie es nicht wirklich zurück speichern. NSArray unterstützt diese Funktion nicht. Statt NSNumbers zu speichern, können Sie Zeiger auf NSNumber (d.h. NSNumber**) speichern und den Verweis auf ein neues Objekt aktualisieren.

Speichern Ihrer Zahlen in normaler double[] Array würde auch funktionieren.

1voto

Abizern Punkte 137651

Eine bessere Möglichkeit wäre, die geänderten Werte in einem neuen Array zu speichern:

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];
}];

Hinweis Ich habe das gerade eingetippt, also entschuldigen Sie bitte eventuelle Syntaxfehler.

0voto

gkoreman Punkte 76

Wenn Sie eine In-Place-Operation durchführen möchten, können Sie dies verwenden:

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

Obwohl NSMutableArray soll nicht threadsafe sein, das ist in der Regel nur, wenn Sie die Größe der es ändern. Funktionierte gut in einem einfachen Test, aber die Verwendung auf eigene Gefahr.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X