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?

¿Fue útil?

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");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top