2009-07-20 4 views
2

Ich erhalte einen seltsamen Fehler, wenn ich einem meiner Objekte einen Wert zuweise. Soweit ich das beurteilen kann, denkt der Compiler, dass ich eine Read-Only-Variable zuweisen würde. Es gibt mir "lvalue erforderlich als linker Operand der Zuweisung" in der Zeile myPlace.publicLocation ....Fehler bei Verwendung des Objekts: "Lvalue erforderlich als linker Operand der Zuweisung"

Ich bin mir sicher, es ist ein klassischer Anfängerfehler - wo liege ich falsch?

CSPlace *myPlace; 
myPlace.publicLocation.coordinate.latitude = 
    [[separatedData objectAtIndex:0] floatValue]; 

Klasse:

#import <CoreLocation/CLLocation.h> 
@interface CSPlace : NSObject { 
    CLLocation *publicLocation; 
} 
@property (copy, nonatomic) CLLocation *publicLocation; 
@end 
#import "CSPlace.h" 
@implementation CSPlace 
@synthesize publicLocation; 
@end 

Antwort

6

CLLocation eine unveränderliche Klasse in Bezug auf Breite und Länge. Sie können also den Breitengrad nicht ändern. Sie müssen ein neues Objekt erstellen:

Unwandelbar ist die ganze Bedeutung eines solchen Initialisierers.

+0

Bonuspunkte für ein neues Konzept in meinen dicken Schädel :) – BankStrong

0

Ich bin kein Objective-C-Experte, aber ich verstehe, es ist ein C-Obermenge ... so sollte es nicht sein:

myPlace->publicLocation->coordinate.latitude

(mit "->" anstelle von ".", Ich weiß nicht für "Koordinate", wenn es ein Zeiger ist oder nicht)

Edit: Außerdem wird Ihr Programm sehr wahrscheinlich abstürzen, wenn Sie versuchen, auf die Attribute eines nicht zugeordneten Objekts zuzugreifen, myPlace in Ihrem Fall ist nicht zugeordnet.

Edit 2: Siehe Johns Kommentar unten für warum meine Antwort ignoriert werden sollte. (Ich lasse es aber, wie es jemand dienen könnte eines Tages den gleichen Fehler machen)

+2

ObjC2 führte eine neue Eigenschaft namens Eigenschaften ein. In dem, was als eines der dümmsten Sprachdesigns aller Zeiten gelten muss, haben sie sich dafür entschieden, das Standard-C 'zu überladen. Betreiber für diesen Zweck. Nicht nur, dass dies komisch in seltsame und rätselhafte Weisen einbricht, die schwer zu verstehen sind, Eigenschaften können sowohl l- als auch r-Werte sein. Fügen Sie dazu die Tatsache hinzu, dass Eigenschaften schreibgeschützt oder schreibgeschützt sein können, was bedeutet, dass die Entschlüsselung einer Kette von Eigenschaftszugriffen für einen Lvalue mehrdeutig sein kann. – johne

+0

Danke johne für die Erklärung :) seltsame Wahl in der Tat sehr abschreckend. – Florian

0

coordinate ist defined als schreibgeschützte Eigenschaft von CLLocation ... so scheint es, müssen Sie eine neue CLLocation eher machen, als die sich ändernde Koordinatenwert eines bestehenden.

0

So gut wie ich herausfinden kann, denkt der Compiler, dass ich eine schreibgeschützte Variable zuweisen.

Sie versuchen, zu einer Nur-Lese-Eigenschaft zuweisen:

@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

Verwandte Themen