2010-12-05 11 views
1

ich ein Objekt mit einem CGPoint Ivar definiert haben und Eigentum verbunden sind wie folgt ...Mischen C Structs und Objective-C Eigenschaften

@interface Sprite : NSObject { 
CGRect boundingBox; 
} 
@property(assign) CGRect boundingBox; 

Wenn ich eine Instanz der Sprite-Klasse verwenden und versuchen, aktualisieren die boundingBox Struktur wie folgt ...

self.boundingBox.origin.x = minX; 

ich eine Kompilierung-Fehlermeldung besagt, ...

L-Wert erforderlich, als linker OperandZuordnung

Bin ich sagen richtig, dass self.boundingBox eine C-Struktur zurück, die nicht tatsächlich die Struktur durch das Sprite-Objekt gehalten ist, sondern eine Kopie davon? Wenn die Zuweisung eines neuen Werts für x fehlschlägt, weil die Struktur nur eine temporäre Kopie ist?

Wenn dies der Fall ist, wird der folgende Code korrekt funktionieren (und ist es der richtige Weg, um das zu erreichen, was ich will)?

CGRect newBoundingBox = self.boundingBox; 
newBoundingBox.origin.x = self.boundingBox.origin.x; 
self.boundingBox = newBoundingBox; 

Antwort

1

BEARBEITETE ANTWORT: Mein ursprünglicher Kommentar über das Nicht-Editieren von CGRect war falsch; Das eigentliche Problem mit dieser ersten Codezeile kommt von der Tatsache, dass Sie self.boundingBox verwenden, um auf die CGRect zuzugreifen. Ihr zweiter Code wird große Arbeit, zusammen mit dem Block I in meiner ursprünglichen Antwort hatte:

Um richtig Werte innerhalb boundingBox zu ändern, werden Sie CGRectMake Funktion Apfel verwenden müssen, etwa so:

CGRect r = self.boundingBox; 
self.boundingBox = CGRectMake(minX, r.y, r.width, r.height); 

Für Eine nette Erklärung, warum die Notation self. ein Problem mit Strukturen ist, finden Sie in den Antworten auf this question. Hoffe das hilft!

+0

Danke dafür! Es macht alles Sinn, abgesehen von dem, was Sie in Bezug auf nicht in der Lage zu sein, ANY CGRect zu bearbeiten. Was hindert Sie daran?Sind C-Strukturen nicht veränderbar? – mmccomb

+0

Wow, meine Entschuldigung hier - ich habe diesen Kommentar völlig falsch verstanden. Ich habe gerade meine Antwort aktualisiert, um die richtigen Informationen dazu zu enthalten. –

+0

Macht jetzt Sinn :) – mmccomb

2

Denken Sie daran, dass Eigenschaften nur Syntax-Aliase für Setter- und Getter-Methoden sind. Dies:

self.boundingBox = newBox; 

entspricht dies:

[self setBoundingBox:newBox]; 

Der Grund, warum Sie dies nicht tun können:

self.boundingBox.origin.x = minX; 

ist, weil es keine Möglichkeit gibt, setBoundingBox: zu nennen, aber es nur bitten, Ändern Sie origin.x, und für die einzelnen Teile der Struktur sind keine individuellen Setter-Methoden verfügbar. Das Beispiel am Ende Ihrer Frage ist die einzige Möglichkeit, das, was Sie versuchen, über Eigenschaften zu erreichen.

Sie von Ursache können über Eigenschaften vergessen und dies tun:

boundingBox.origin.x = minX 

, die direkt auf die aktuellen Objekte boundingBox Instanzvariable (unter der Annahme einer vorhanden ist), sondern umgeht die Setter-Methode schreibt, was unerwünscht sein kann.