【问题标题】:error when using object: "lvalue required as left operand of assignment"使用对象时出错:“需要左值作为赋值的左操作数”
【发布时间】:2009-07-20 12:30:38
【问题描述】:

我在为我的一个对象赋值时遇到了一个奇怪的错误。据我所知,编译器认为我正在分配一个只读变量。它在 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

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    CLLocation 一个关于纬度和经度的不可变类。所以你不能修改它的纬度。您必须创建一个新对象:

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

    不可变就是拥有这样一个初始化器的全部意义。

    【讨论】:

    • 将新概念带入我厚厚的脑袋的奖励积分 :)
    【解决方案2】:

    coordinatedefined 作为CLLocation 的只读属性...所以看来您需要创建一个新的CLLocation 而不是更改现有的坐标值。

    【讨论】:

      【解决方案3】:

      尽我所能,编译器认为我分配给一个只读变量。

      您正在尝试分配给只读属性:

      @property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

      【讨论】:

        【解决方案4】:

        我不是 Objective-C 专家,但我知道它是 C 超集......所以不应该是这样:

        myPlace->publicLocation->coordinate.latitude

        (用“->”代替“.”,不知道“坐标”是不是指针)

        编辑:此外,如果您尝试访问未分配对象的属性,您的程序很可能会崩溃,在您的情况下 myPlace 未分配。

        编辑 2:请参阅下面约翰的评论,了解为什么我的回答应该被忽略。 (不过我要离开它,因为它可能会为有一天犯同样错误的人服务)

        【讨论】:

        • ObjC2 引入了一个名为属性的新“功能”。在必须被列为有史以来最愚蠢的语言设计选择之一中,他们选择重载标准 C '。运营商为此目的。这不仅以难以理解的奇怪而神秘的方式滑稽地打破,而且属性可以是 l 和 r 值。除此之外,属性可以是只读的或读写的,这意味着破译左值的属性访问链可能是模棱两可的。
        • 感谢 johne 的解释 :) 确实很奇怪的选择,非常令人反感。
        猜你喜欢
        • 2016-09-03
        • 2011-12-20
        • 2011-03-04
        • 2011-09-03
        相关资源
        最近更新 更多