Свойство CGPoint, используемое в классе из другого класса с ошибкой Lvalue

У меня есть два основных класса в Objective C, использующих cocos2D, DebugZoneLayer и HeroClass. Использование Cocos2D не может быть частью проблемы.

HeroClass содержит CGPoint и свойство. У меня есть экземпляр HeroClass в DebugZoneLayer, инициализированный как 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 требуется как левый операнд присваивания


person Chewie The Chorkie    schedule 02.05.2011    source источник
comment
Взгляните на этот недавний вопрос.   -  person jscs    schedule 03.05.2011


Ответы (2)


Правильно — так делать нельзя. Свойство — это просто вызов метода, а методы в Objective-C всегда возвращают значение, а это означает, что возвращаемый CGPoint — это просто временный CGPoint с тем же значением, что и в вашем объекте. Установка компонентов этого временного значения не разрешена. Вам нужно будет либо создать специальные установщики в своем классе для значений X и Y точки, либо установить всю точку за раз.

person Chuck    schedule 02.05.2011
comment
Спасибо. Я просто установлю всю свою CGPoint за раз. - person Chewie The Chorkie; 03.05.2011

Перефразируя совершенно правильный ответ Чака по-другому.

Ваша проблема в том, что CGPoints не являются объектами Objective-c, они являются структурами C. Ваше свойство *_vel* не является экземпляром объекта, например NSArray, NSArray или DebugZoneLayer.

В качестве простого и ленивого примера, используя int вместо struct и немного псевдокода..

@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;

Изменение значения bar не изменит значения переменной экземпляра _numberOfLives объекта foo, потому что при вызове -livesRemaining bar была установлена ​​копия текущего значения _numberOfLives.

Короче говоря, вам нужно выучить немного C.

person hooleyhoop    schedule 02.05.2011