Frage

Ich will meinen CGPoint zum NSMutable Array speichern, so, ich habe Methode wie folgt:

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

Aber ich habe den Fehler, so heißt das:

  

Inkompatible Typ für Argument 1 von   "AddObject".

Also, ich die API-Check-out,

- (void)addObject:(id)anObject
  

anObject Das Objekt bis zum Ende hinzufügen   des Empfängers Inhalt. Dieser Wert   nicht gleich Null ist.

Also, ich denke, die „ CGPointMake “ ein Objekt machen, aber es kann nicht zugeordnet werden. Was passiert?

War es hilfreich?

Lösung

Das Problem ist, dass CGPoint ist eigentlich nur eine C-Struktur ist kein Objekt:

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

Wenn Sie auf dem iPhone sind, können Sie die NSValue UIKit Ergänzungen verwenden, um die CGPoint zu einem NSValue Objekt zu konvertieren.

Sehen Sie diese vorherige Antwort für Beispiele:

Andere Tipps

Sie können auch Folgendes tun:

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

Leider ist für Sie ein CGPoint ist kein Objective-c-Objekt. Es ist eine C-Struktur. Wenn Sie Apple Doppelklick auf CGPoint sollten Sie auf die Definition springen

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

Wenn Sie CGPoint in einer NSArray speichern wollen, werden Sie brauchen, um sie zuerst zu wickeln. Sie können NSValue für diese verwenden oder eigene Wrapper schreiben.

finden Sie unter eine CGPoint zu NSValue Konvertieren

EDIT> Es gibt einen kleinen Overhead für jeden Ziel-c Methodenaufruf und das Erstellen und Objekte beinhaltet Anrufe viele Verfahren zu zerstören, bevor sie sogar für alles verwendet werden. Sie sollten normalerweise nicht kümmern, aber für sehr kleine Objekte, die wenig Verhalten zu kapseln und die haben eine kurze Lebensdauer es die Leistung beeinträchtigen können. Wenn Apple Objekte für alle Punkte verwendet, rect, Größen und sogar Ints, Schwimmern, etc. Leistung wäre schlimmer.

zu bauen auf die Antwort von atbreuer11 gegeben, können Sie Ihre CGPoint zu NSValue, sollte sie in NSMutableArray konvertieren und wandeln sie zurück, um die Verwendung von folgenden:

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

Sie es dann wieder aufrichten:

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

Das ist wahrscheinlich der einfachste Weg, es zu tun. Sie können eine komplette Klasse schreiben und alle Arten von Datenmanipulation tun, aber ich denke, es wäre zuviel des Guten sein, wenn Sie wirklich haben.

Swift 3.x
// Convert CGPoint zu NSValue

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

// es wiederherstellen wieder

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

Eine einfache Art und Weise zu handhaben CGPoint (oder jede andere nicht NSObject geerbt Struktur) ist eine neue Klasse von NSObject geerbt zu erstellen.

Der Code ist länger, aber sauber. Ein Beispiel hierfür ist unter:

In .h-Datei:

@interface MyPoint:NSObject
{
     CGPoint myPoint;   
}

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

@end

In .m-Datei:

@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

Hier finden Sie einige Codebeispiel die Verwendung zeigt, vergessen Sie nicht auf Release !!!

//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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top