Как я могу легко добавить объекты CGPoint в NSArray?

129

У меня около 50 объектов CGPoint, которые описывают что-то вроде «пути», и я хочу добавить их в массив NSArray. Это будет метод, который просто вернет соответствующий CGPoint для данного индекса. Я не хочу создавать 50 переменных типа p1 = ...; p2 = ... и так далее. Есть ли простой способ, который позволил бы мне определять эти точки «мгновенно» при инициализации NSArray объектами?

Спасибо
источник

Ответы:

324

С UIKitApple , добавлена поддержка CGPoint к NSValue, так что вы можете сделать:

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

Перечислите столько экземпляров [NSValue], сколько у вас CGPoint, и завершите список нулем. Все объекты в этой структуре освобождаются автоматически.

С другой стороны, когда вы извлекаете значения из массива:

NSValue *val = [points objectAtIndex:0];
CGPoint p = [val CGPointValue];
Джаррет Харди
источник
3
Для скалярных типов взгляните на NSNumber ... вы увидите такие конструкторы, как numberWithBool: numberWithInteger: numberWithFloat :, numberWithUnsignedShort: и т. Д.
Джаррет Харди,
4
В качестве альтернативы вы можете использовать NSValue напрямую: например [NSValue valueWithBytes: & someStructSockaddr objCType: @encode (struct sockaddr)].
Джим Дови,
7

Я использую это:

Создать массив:

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

Получите 1-й объект CGPoint:

CGPoint myPoint = [myArray[0] CGPointValue];
Тибидабо
источник
3

Вы также можете написать это в минимальной форме:

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

CGPoint p2 = myArray[1];
GilesDMiddleton
источник
2

Вы смотрели CFMutableArray? Это может сработать для вас лучше.

Рамин
источник