Comment puis-je ajouter un CGPoint à NSMutableArray?
-
30-09-2019 - |
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?
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.
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");