从其他类中使用的CGPoint属性,带有Lvalue错误

时间:2011-05-02 20:35:59

标签: objective-c class properties subclass cgpoint

我使用cocos2D,DebugZoneLayer和HeroClass在Objective C中有两个主要的类。使用Cocos2D可能不是问题的一部分。

HeroClass包含CGPoint和属性。我在DebugZoneLayer中有一个HeroClass实例,初始化为 hero = [[HeroClass alloc] init];

我的HeroClass.h缩短为向您展示我如何创建CGPoint vel。

@interface HeroClass : CCLayer {
    @public CGPoint _vel;
}

@property(assign) CGPoint vel;

在HeroClass.m中,我合成了我的属性,如 @synthesize vel = _vel;

在DebugZoneLayer.m中,我可以引用我的hero.vel x或y就好了,但是为hero.vel x或y赋值的任何内容都会返回错误: Lvalue作为赋值的左操作数

2 个答案:

答案 0 :(得分:1)

这是对的 - 你做不到。属性只是一个方法调用,Objective-C中的方法总是按值返回,这意味着返回的CGPoint只是一个临时CGPoint,其值与对象中的值相同。不允许设置此临时值的组件。您需要在类上为点的X和Y值创建特殊的setter,或者一次设置整个点。

答案 1 :(得分:1)

以不同的方式重述Chuck完全正确的答案..

您的问题是CGPoints不是Objective-c对象,它们是C结构。您的属性* _vel *不是Object的实例,如NSArray,NSArray或DebugZoneLayer。

作为一个简单而懒惰的例子,使用int而不是结构和一些伪代码...

@interface HeroClass : CCLayer {
    int _numberOfLives;
}
@end

@implementation HeroClass
- (id)init {
    [super init];
    _numberOfLives = 3;
}

- (int)livesRemaining {
    return _numberOfLives;
}
@end

你不能像这样设置_numberOfLives的值..

foo = [[HeroClass alloc] init];
bar = [foo livesRemaining];
bar = 2;

更改的值不会更改foo的 _numberOfLives 实例变量的值,因为当您调用 -livesRemaining 时, bar 设置为 _numberOfLives 的当前值的副本。

简而言之,你需要向你学习一些C.