Как добавить CGPoint в nsmutablearray?
-
30-09-2019 - |
Вопрос
Я хочу сохранить свой CGPoint на NSmutable Array, поэтому у меня есть метод, как это:
[self.points addObject:CGPointMake(x, y)];
Но я получил ошибку, она сказала, что:
Несовместимый тип для аргумента 1 «Addobject».
Итак, я проверю API,
- (void)addObject:(id)anObject
anobject объект, чтобы добавить к контелю контента приемника. Это значение не должно быть ноль.
Итак, я думаю, что "CGPointMake.«Можно сделать объект, но его нельзя назначить. Что происходит?
Решение
Проблема в том, что CGPoint на самом деле просто структура C, это не объект:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
Если вы на iPhone, вы можете использовать дополнения NsValue Uikit, чтобы преобразовать CGPoint на объект nsvalue.
Смотрите этот предыдущий ответ на примеры: Как я могу добавить объекты CGPoint в NSARRAY простой способ?
Другие советы
Вы также можете сделать следующее:
[myArray addObject:[NSValue valueWithCGPoint:MyCGPoint]];
К сожалению для вас CGPoint не является объектом объекта. Это структура переменного тока. Если вы Apple дважды щелкните по CGPoint, вы должны перейти к определению
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
Если вы хотите сохранить CGPoint в Nsarray, вам нужно будет сначала обернуть их. Вы можете использовать NsValue для этого или написать собственную обертку.
видеть Преобразование CGPoint в nsvalue
Редактировать> Существует небольшой накладные расходы для каждого вызова метода объектов-C, а создание и уничтожение объектов включают множество вызовов метода до того, как они даже будут использоваться для чего-либо. Вы не должны беспокоиться об этом нормально, но для очень маленьких объектов, которые инкапсулируют мало поведения, и которые имеют короткие жизненные жизни, это может повлиять на производительность. Если Apple использовала объекты для всех точек, прямых, размеров и даже INT, Floats, производительность и т. Д. Было бы хуже.
Для создания ответа, данного ATBREUER11, вы можете преобразовать свой CGPoint в nsvalue, храните его в nsmutablearray и конвертировать его обратно, используя следующее:
//Convert CGPoint and Store it
CGPoint pointToConvert = CGPointMake(100.0f, 100.0f);
NSValue *valueToStore = [NSValue valueWithCGPoint:pointToConvert];
NSMutableArray *arrayToKeep =[NSMutableArray arrayWithObject:valueToStore];
Затем восстановить это снова:
CGPoint takeMeBack;
for (NSValue *valuetoGetBack in arrayToKeep) {
takeMeBack = [valuetoGetBack CGPointValue];
//do something with the CGPoint
}
Это, вероятно, самый простой способ сделать это. Вы можете написать полный класс и делать все типы манипуляций данных, но я думаю, что это был бы излишек, если только вы не должны.
Swift 3.x.
// Конвертировать CGPoint в nsvalue
let cgPoint = CGPoint(x: 101.4, y: 101.0)
let nsValue = NSValue(cgPoint: cgPoint)
var array = NSArray(object: nsValue)
// восстановить это снова
var cgPoint : CGPoint!
for i in array {
cgPoint = i as? CGPoint
}
Простой способ обрабатывать CGPoint
(или любой другой не NSObject
Унаследованная структура) - создать новый класс, унаследованный от NSObject
.
Код дольше, но чистый. Пример ниже:
В .h Файл:
@interface MyPoint:NSObject
{
CGPoint myPoint;
}
- (id) init;
- (id) Init:(CGPoint) point;
- (BOOL)isEqual:(id)anObject;
@end
В .m Файл:
@implementation MyPoint
- (id) init
{
self = [super init];
myPoint = CGPointZero;
return self;
}
- (id) Init:(CGPoint) point{
myPoint.x = point.x;
myPoint.y = point.y;
return self;
}
- (BOOL)isEqual:(id)anObject
{
MyPoint * point = (MyPoint*) anObject;
return CGPointEqualToPoint(myPoint, point->myPoint);
}
@end
Вот какой-то образец кода, показывающий использование, не забудьте выпускать!!!
//init the array
NSMutableArray *pPoints;
pPoints = [[NSMutableArray alloc] init];
// init a point
MyPoint *Point1 = [[MyPoint alloc]Init:CGPointMake(1, 1)];
// add the point to the array
[pPoints addObject:[[MyPoint alloc] Point1]];
//add another point
[Point1 Init:CGPointMake(10, 10)];
[pPoints addObject:[[MyPoint alloc] Point1]];
[Point1 Init:CGPointMake(3, 3)];
if ([pPoints Point1] == NO))
NSLog(@"Point (3,3) is not in the array");
[Point1 Init:CGPointMake(1, 1)];
if ([pPoints Point1] == YES))
NSLog(@"Point (1,1) is in the array");