Question

Je veux enregistrer mon CGPoint au tableau NSMutable, donc, j'ai méthode comme ceci:

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

Mais je suis l'erreur, il a dit que:

  

type incompatible pour l'argument 1 de   "AddObject".

Alors, je vérifie l'API,

- (void)addObject:(id)anObject
  

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

Alors, je pense que le « CGPointMake » peut faire un objet, mais il ne peut pas être affecté. Qu'est-ce qui se passe?

Était-ce utile?

La solution

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

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

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

Voir cette réponse précédente pour des exemples:

Autres conseils

Vous pouvez également effectuer les opérations suivantes:

[myArray addObject:[NSValue valueWithCGPoint:MyCGPoint]];

Malheureusement pour vous un CGPoint est pas un objet Objective-c. Il est un struct c. si vous d'Apple double-cliquez sur CGPoint vous devez passer à la définition

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

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

voir Conversion d'un CGPoint à NSValue

EDIT> Il y a une petite surcharge pour chaque méthode objective-c appel, et la création et la destruction des objets implique de nombreux appels de méthode avant même d'être utilisés pour quoi que ce soit. Ne vous inquiétez pas à ce sujet, mais normalement pour les très petits objets qui encapsulent peu le comportement et qui ont de courtes durées de vie, il peut affecter les performances. Si Apple a utilisé des objets pour tous les points, rect, tailles et même ints, flotteurs, etc performance serait pire.

Pour construire sur la réponse donnée par atbreuer11, vous pouvez convertir votre CGPoint à NSValue, rangez-le dans NSMutableArray et de le convertir en utilisant de nouveau les éléments suivants:

//Convert CGPoint and Store it
CGPoint pointToConvert = CGPointMake(100.0f, 100.0f);
NSValue *valueToStore = [NSValue valueWithCGPoint:pointToConvert];
NSMutableArray *arrayToKeep =[NSMutableArray arrayWithObject:valueToStore];

Puis restaurer à nouveau:

CGPoint takeMeBack;
for (NSValue *valuetoGetBack in arrayToKeep) {
    takeMeBack = [valuetoGetBack CGPointValue];
    //do something with the CGPoint
}

C'est probablement la meilleure façon de le faire. Vous pouvez écrire une classe complète et faire tous les types de manipulation de données, mais je pense que ce serait un surpuissant, à moins que vous avez vraiment.

3.x Swift // Convertir CGPoint à NSValue

let cgPoint = CGPoint(x: 101.4, y: 101.0)
let nsValue = NSValue(cgPoint: cgPoint)
var array = NSArray(object: nsValue)

// Restauration nouveau

var cgPoint : CGPoint!
for i in array {
  cgPoint = i as? CGPoint
}

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

Le code est plus long, mais propre. Un exemple est 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 version !!!

//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");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top