Wie kann ich einem NSArray auf einfache Weise CGPoint-Objekte hinzufügen?


129

Ich habe ungefähr 50 CGPoint-Objekte, die so etwas wie einen "Pfad" beschreiben, und ich möchte sie einem NSArray hinzufügen. Es wird eine Methode sein, die nur den entsprechenden CGPoint für einen bestimmten Index zurückgibt. Ich möchte keine 50 Variablen wie p1 = ... erstellen. p2 = ... und so weiter. Gibt es eine einfache Möglichkeit, diese Punkte "sofort" zu definieren, wenn ich das NSArray mit Objekten initialisiere?

Antworten:


324

Mit UIKitApple wurde die Unterstützung für CGPoint hinzugefügt NSValue, sodass Sie Folgendes tun können:

NSArray *points = [NSArray arrayWithObjects:
                     [NSValue valueWithCGPoint:CGPointMake(5.5, 6.6)],
                     [NSValue valueWithCGPoint:CGPointMake(7.7, 8.8)],
                     nil];

Listen Sie so viele [NSValue] -Instanzen auf, wie Sie über CGPoint verfügen, und beenden Sie die Liste mit Null. Alle Objekte in dieser Struktur werden automatisch freigegeben.

Auf der anderen Seite, wenn Sie die Werte aus dem Array ziehen:

NSValue *val = [points objectAtIndex:0];
CGPoint p = [val CGPointValue];

3
Für skalare Typen werfen Sie einen Blick auf NSNumber ... Sie werden Konstruktoren wie numberWithBool: numberWithInteger: numberWithFloat:, numberWithUnsignedShort: usw. sehen
Jarret Hardie

4
Alternativ können Sie NSValue direkt verwenden: [NSValue valueWithBytes: & someStructSockaddr objCType: @encode (struct sockaddr)] zum Beispiel.
Jim Dovey

7

Ich benutze das:

Array erstellen:

NSArray *myArray = @[[NSValue valueWithCGPoint:CGPointMake(30.0, 150.0)],[NSValue valueWithCGPoint:CGPointMake(41.67, 145.19)]];

1. CGPoint-Objekt abrufen:

CGPoint myPoint = [myArray[0] CGPointValue];

3

Sie können dies auch in einer minimalen Form schreiben:

CGPoint myArray[] = { CGPointMake(5.5, 6.6), CGPointMake(7.7, 8.8) };

CGPoint p2 = myArray[1];

2

Hast du dir das angeschaut CFMutableArray? Das könnte für Sie besser funktionieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.