Domanda

voglio conservare il mio CGPoint alla Array NSMutable, così, ho metodo come questo:

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

Ma ho ottenuto l'errore, ha detto che:

  

tipo non compatibile per argomento 1 di   "AddObject".

Quindi, ho check out l'API,

- (void)addObject:(id)anObject
  

anObject l'oggetto da aggiungere alla fine   del contenuto del ricevitore. Questo valore   non deve essere pari a zero.

Quindi, penso che il " CGPointMake " può fare un oggetto, ma non può essere assegnato. Che cosa succede?

È stato utile?

Soluzione

Il problema è che CGPoint è in realtà solo una struttura C non è un oggetto:

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

Se si è su iPhone è possibile utilizzare le aggiunte NSValue UIKit per convertire il CGPoint ad un oggetto NSValue.

Vai a questa risposta precedente per gli esempi: Come posso aggiungere CGPoint oggetti a un NSArray il modo più semplice?

Altri suggerimenti

È inoltre possibile effettuare le seguenti operazioni:

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

Purtroppo per voi un CGPoint non è un oggetto Objective-C. Si tratta di una c struct. se Apple ha doppio click su CGPoint si dovrebbe passare alla definizione

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

Se si desidera memorizzare CGPoint in un NSArray sarà necessario avvolgerli prima. È possibile utilizzare NSValue per questo o lascia la tua involucro.

Conversione di un CGPoint per NSValue

MODIFICA> C'è un piccolo overhead per ogni chiamata di metodo Objective-C, e creare e distruggere oggetti coinvolge molte chiamate di metodo, prima che esse utilizzato per nulla. Non si deve preoccupare di questo normalmente ma per oggetti molto piccoli che racchiudono comportamento poco e che hanno tempi di vita brevi può influire sulle prestazioni. Se Apple ha utilizzato gli oggetti per tutti i punti, rect, dimensioni e persino interi, galleggianti, etc prestazioni sarebbe peggio.

Per costruire sulla risposta data dal atbreuer11, è possibile convertire il vostro CGPoint a NSValue, conservarlo in NSMutableArray e riconvertirlo usando il seguente:

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

Poi il ripristino di nuovo:

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

Questo è probabilmente il modo più semplice per farlo. È possibile scrivere una classe completa e fare tutti i tipi di manipolazione dei dati, ma penso che sarebbe un peso inutile, a meno che non si hanno veramente a.

Swift 3.x
// Converti CGPoint a NSValue

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

// Ripristino di nuovo

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

Un modo semplice per maniglia CGPoint (o in qualsiasi altro NSObject struttura ereditata) è quello di creare una nuova classe ereditata da NSObject.

Il codice è più lungo, ma pulito. Un esempio è qui sotto:

In .h file:

@interface MyPoint:NSObject
{
     CGPoint myPoint;   
}

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

@end

In .m file:

@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

Ecco qualche esempio di codice che mostra l'utilizzo, non dimenticate di stampa !!!

//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");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top