41 votes

Comment puis-je ajouter un CGPoint à NSMutableArray?

Je veux stocker mes CGPoint à la NSMutable Tableau, donc , j'ai de la méthode comme ceci:

[auto.points addObject:CGPointMake(x, y)];

Mais j'ai obtenu l'erreur, il dit que :

Incompatible type de l'argument 1 de "addObject".

Donc, j'ai vérifier l'API,

(void)addObject:(id)anObject

anObject L'objet à ajouter à la fin du récepteur de contenu. Cette valeur ne doit pas être nul.

Donc, je pense que le "CGPointMake" peut faire un Objet, mais il ne peut pas être attribué. Ce qui se passe?

36voto

kharrison Points 2054

Le problème est que CGPoint est en fait qu'une structure C, il n'est pas un objet:

struct CGPoint {
   CGFloat x;
   CGFloat y;
};
typedef struct CGPoint CGPoint;

Si vous êtes sur l'iPhone, vous pouvez utiliser le NSValue UIKit ajouts à convertir le CGPoint à un NSValue objet.

Voir cette réponse précédente par des exemples: http://stackoverflow.com/questions/899600/how-can-i-add-cgpoint-objects-to-an-nsarray-the-easy-way

32voto

user1971250 Points 161

Vous pouvez également effectuer les opérations suivantes:

[montableau addObject:[NSValue valueWithCGPoint:MyCGPoint]]

11voto

hooleyhoop Points 6925

Malheureusement pour vous un CGPoint n'est pas un Objectif-c objet. C'est un c struct. si vous Apple double-cliquez sur CGPoint vous devez sauter à la définition

struct CGPoint {
    CGFloat x;
    CGFloat y;
};
typedef struct CGPoint CGPoint;

Si vous souhaitez stocker CGPoint dans un NSArray vous aurez besoin de les envelopper d'abord. Vous pouvez utiliser NSValue pour ce ou écrire votre propre emballage.

voir http://stackoverflow.com/questions/772958/converting-a-cgpoint-to-nsvalue

EDIT> Il y a une petite surcharge pour chaque objectif-c appel de méthode, et de créer et détruire des objets implique de nombreux appels de méthode avant même d'être utilisé pour quoi que ce soit. Vous ne devriez pas vous soucier de ce normalement, mais pour de très petits objets qui encapsulent peu de comportement et qui ont des durées de vie courtes, il peut affecter les performances. Si Apple a utilisé des objets pour tous les points, rect, de tailles et de même ints, des flotteurs, etc rendement serait pire.

-1voto

alexu Points 1

Une façon simple de manipuler CGPoint (ou de toute autre non NSObject a hérité de la structure) est de créer une nouvelle classe héritée de NSObject.

Le code est plus long, mais propre. Un exemple ci-dessous:

Dans .h fichier:

@interface MyPoint:NSObject
{
     CGPoint myPoint;   
}

- (id) init;
- (id) Init:(CGPoint) point;
- (BOOL)isEqual:(id)anObject;

@end

Dans .m fichier:

@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

Voici quelques exemple de code montrant l'utilisation, ne pas oublier de libération!!!

//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");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X