Як я можу легко додати об'єкти 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: і т.д.
Jarret Hardie

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

Отримайте перший об'єкт CGPoint:

CGPoint myPoint = [myArray[0] CGPointValue];

3

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

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

CGPoint p2 = myArray[1];

2

Ви подивилися CFMutableArray? Це могло б працювати для вас краще.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.