Comment puis-je ajouter facilement des objets CGPoint à un NSArray?

129

J'ai environ 50 objets CGPoint qui décrivent quelque chose comme un "chemin", et je veux les ajouter à un NSArray. Ce sera une méthode qui retournera simplement le CGPoint correspondant pour un index donné. Je ne veux pas créer 50 variables comme p1 = ...; p2 = ..., et ainsi de suite. Existe-t-il un moyen simple qui me permettrait de définir ces points "instantanément" lors de l'initialisation du NSArray avec des objets?

Merci
la source

Réponses:

324

Avec UIKitApple a ajouté la prise en charge de CGPoint à NSValue, vous pouvez donc faire:

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

Répertoriez autant d'instances [NSValue] que vous avez CGPoint et terminez la liste par nil. Tous les objets de cette structure sont libérés automatiquement.

D'un autre côté, lorsque vous extrayez les valeurs du tableau:

NSValue *val = [points objectAtIndex:0];
CGPoint p = [val CGPointValue];
Jarret Hardie
la source
3
Pour les types scalaires, jetez un œil à NSNumber ... vous verrez des constructeurs comme numberWithBool: numberWithInteger: numberWithFloat :, numberWithUnsignedShort :, etc.
Jarret Hardie
4
Vous pouvez également utiliser NSValue directement: [NSValue valueWithBytes: & someStructSockaddr objCType: @encode (struct sockaddr)] par exemple.
Jim Dovey
7

J'utilise ceci:

Créer un tableau:

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

Obtenez le 1er objet CGPoint:

CGPoint myPoint = [myArray[0] CGPointValue];
Tibidabo
la source
3

Vous pouvez également écrire ceci sous une forme minimale de:

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

CGPoint p2 = myArray[1];
GilesDMiddleton
la source
2

Avez-vous jeté un œil à CFMutableArray? Cela pourrait mieux fonctionner pour vous.

Ramin
la source