Como posso adicionar objetos CGPoint a um NSArray da maneira mais fácil?


129

Eu tenho cerca de 50 objetos CGPoint que descrevem algo como um "caminho" e quero adicioná-los a um NSArray. Será um método que retornará o CGPoint correspondente para um determinado índice. Eu não quero criar 50 variáveis ​​como p1 = ...; p2 = ... e assim por diante. Existe uma maneira fácil que me permita definir esses pontos "instantaneamente" ao inicializar o NSArray com objetos?

Respostas:


324

Com a UIKitApple, foi adicionado suporte ao CGPoint para NSValueque você possa:

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

Liste quantas instâncias [NSValue] como você possui o CGPoint e termine a lista em zero. Todos os objetos nesta estrutura são liberados automaticamente.

Por outro lado, quando você está retirando os valores da matriz:

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

3
Para os tipos escalares, ter um olhar para NSNumber ... você vai ver construtores como numberWithBool: numberWithInteger: numberWithFloat :, numberWithUnsignedShort :, etc.
Jarret Hardie

4
Como alternativa, você pode usar o NSValue diretamente: [NSValue valueWithBytes: & someStructSockaddr objCType: @encode (struct sockaddr)], por exemplo.
22411 Jim Dovey

7

Eu uso isso:

Criar matriz:

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

Obtenha o primeiro objeto CGPoint:

CGPoint myPoint = [myArray[0] CGPointValue];

3

Você também pode escrever isso em uma forma mínima de:

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

CGPoint p2 = myArray[1];

2

Você já deu uma olhada CFMutableArray? Isso pode funcionar melhor para você.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.