¿Cómo agrego un CGPoint a NSMutableArray?
-
30-09-2019 - |
Pregunta
quiero guardar mi CGPoint a la matriz de NSMutable, así, tengo método como este:
[self.points addObject:CGPointMake(x, y)];
Pero tengo el error, se dice que:
Tipo incompatible para el argumento 1 de "AddObject".
Por lo tanto, echa un vistazo a la API,
- (void)addObject:(id)anObject
unObjeto El objeto a añadir a la final del contenido del receptor. Este valor no debe ser nulo.
Por lo tanto, creo que el " CGPointMake " puede hacer que un objeto, pero no se puede asignar. ¿Qué ocurre?
Solución
El problema es que CGPoint es en realidad sólo una estructura C que no es un objeto:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
Si usted está en el iPhone puede utilizar las adiciones NSValue UIKit para convertir el CGPoint a un objeto NSValue.
Ver esta respuesta anterior para ejemplos: ¿Cómo puedo añadir CGPoint objetos a un NSArray el camino más fácil?
Otros consejos
También puede hacer lo siguiente:
[myArray addObject:[NSValue valueWithCGPoint:MyCGPoint]];
Por desgracia para usted una CGPoint no es un objeto de Objective-C. Es un struct c. si de Apple haga doble clic en CGPoint que debe saltar a la definición
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
Si desea almacenar CGPoint en un NSArray tendrá que envolverlos en primer lugar. Se puede utilizar para este NSValue o escribir su propio envoltorio.
Conversión de un CGPoint a NSValue
Editar> Hay una pequeña sobrecarga para cada método llamado Objective-C, y la creación y destrucción de objetos implica muchas llamadas a métodos antes de que sean utilizados para cualquier cosa. Usted no debe preocuparse por esto normalmente pero muy pequeños objetos que encapsulan el comportamiento poco y que tienen una corta vida que puede afectar al rendimiento. Si Apple utiliza objetos para todos los puntos, rect, tamaños y enteros incluso, flotadores, etc. rendimiento sería peor.
Para construir sobre la respuesta dada por atbreuer11, puede convertir su CGPoint a NSValue, almacenarlo en NSMutableArray y convertirlo de nuevo utilizando la siguiente:
//Convert CGPoint and Store it
CGPoint pointToConvert = CGPointMake(100.0f, 100.0f);
NSValue *valueToStore = [NSValue valueWithCGPoint:pointToConvert];
NSMutableArray *arrayToKeep =[NSMutableArray arrayWithObject:valueToStore];
A continuación, restaure de nuevo:
CGPoint takeMeBack;
for (NSValue *valuetoGetBack in arrayToKeep) {
takeMeBack = [valuetoGetBack CGPointValue];
//do something with the CGPoint
}
Eso es probablemente la forma más fácil de hacerlo. Puede escribir una clase completa y hacer todo tipo de manipulación de datos, pero creo que sería una exageración, a menos que realmente tenga que hacerlo.
Swift 3.x
// Convertir CGPoint a NSValue
let cgPoint = CGPoint(x: 101.4, y: 101.0)
let nsValue = NSValue(cgPoint: cgPoint)
var array = NSArray(object: nsValue)
// Restaurar de nuevo
var cgPoint : CGPoint!
for i in array {
cgPoint = i as? CGPoint
}
Una manera simple de CGPoint
mango (o cualquier otra estructura heredada no NSObject
) es crear una nueva clase heredada de NSObject
.
El código es más largo, pero limpio. Un ejemplo es el siguiente:
En .h archivo:
@interface MyPoint:NSObject
{
CGPoint myPoint;
}
- (id) init;
- (id) Init:(CGPoint) point;
- (BOOL)isEqual:(id)anObject;
@end
En .m archivo:
@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
Aquí hay alguna código de ejemplo que muestra el uso, no se olvide de versión !!!
//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");