2009-07-20 17 views
2

オブジェクトの1つに値を割り当てる際に奇妙なエラーが発生します。私が理解できる限り、コンパイラは私が読み込み専用の変数に割り当てると考えています。これはmyPlace.publicLocation ...行に "割り当ての左オペランドとして必要な左辺値"を与えます。オブジェクトを使用しているときにエラーが発生しました:「割り当ての左オペランドとして必要な左辺値」

私はそれが古典的な初心者の間違いだと確信しています - どこが間違っていますか?

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

クラス:

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

答えて

6

CLLocation緯度及び経度に対して不変クラス。したがって、その緯度を変更することはできません。

[[CLLocation alloc] initWithLatitude:latitude longitude:longitude]; 

は不変なので、このような初期化子を持つことの全体の意味がある:あなたは、新しいオブジェクトを作成する必要があります。

+0

私の厚手の頭蓋骨に新しいコンセプトを得るためのボーナスポイント:) – BankStrong

0

私はObjective-Cの専門家だが、私はそれがC-スーパーセットです理解して...そう、それはすべきではない:

myPlace->publicLocation->coordinate.latitude

( "。"ではなく " - "で、ポインタの場合は "座標"はわかりません)

編集:また、割り当てられていないオブジェクトの属性にアクセスしようとすると、プログラムがクラッシュする可能性が高くなります。myPlaceが割り当てられていません。

編集2:私の答えを無視する必要がある理由について、以下のjohneのコメントを参照してください。

+2

ObjC2は、プロパティと呼ばれる新しい「機能」を導入しました。これまでに最悪の言語設計の選択肢の1つとしてランクされなければならないもので、彼らは標準Cを過負荷にすることを選択しました。この目的のためにオペレータ。これは奇妙で神秘的な方法で分かりにくいだけでなく、特性はl値とr値の両方になります。これに、プロパティを読み取り専用または読み書き可能にするという事実を追加します。これは、左辺のプロパティアクセスの連鎖を解読することが曖昧なことを意味します。 – johne

+0

説明のためにjohneありがとうございました:)確かに、奇妙な選択、非常に不快。 – Florian

0

coordinateCLLocationの読み取り専用プロパティとしてdefinedである(それはいつか同じ間違いを誰かに役立つかもしれないと私はしかし、それを残している)...そう、あなたが変更するのではなく、新しいCLLocationを作成する必要が表示されます既存の座標値。

0

私が知る限り、コンパイラは読み込み専用の変数に割り当てていると考えます。

あなたは読み取り専用プロパティに割り当てしようとしている:

@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;