【发布时间】:2012-06-21 23:00:17
【问题描述】:
在我的项目中,我通常有一个复合对象 (GameObject),它需要将 ivar 的一些属性公开到 GameObject 的接口中。例如,一个 GameObject 有一个带有“position”属性的 Sprite,我想使用 Sprite 的位置作为 GameObject 的一个属性。这很容易:
// GameObject.h
@interface GameObject : NSObject
@property CGPoint position;
...
@end
// GameObject.m
@interface GameObject ()
@property Sprite* sprite; // private property
@end
@implementation
- (CGPoint)position { return sprite.position; };
- (void)setPosition:(CGPoint)p { sprite.position = p; };
...
作为一个附带项目,我一直在研究使用 C 宏生成 getter/setter。理想情况下,我能做到:
@implementation
EXPOSE_SUBCOMPONENT_PROPERTY(subcomponent,propertyName,propertyType);
...
我最近失败的尝试是:
#define EXPOSE_SUBCOMPONENT_PROPERTY(sub,property,type) \
- (type)property { id x = sub; return x.##property;} \
- (void)setProperty:(type)set_val { id x = sub; x.##property = set_val; } \
有任何宏向导可以提供帮助吗? 其次,有没有办法不需要将属性的类型提供给宏?
【问题讨论】:
-
你看过
@synthesize -
我不确定您是否完全阅读了我的问题。我希望 ivar(sprite)的属性(位置)成为封闭对象(gameObject)的属性 - 使用 gameObject.position 而不是 gameObject.sprite.position。如果 '@synthesize' 更神奇,我可以做 '@synthesize position = sprite.position;'
-
你总是可以使用绑定 + KVO...
-
重点是我不想在我的公共界面中暴露精灵的其余属性。我没有将它绑定到任何东西,我只需要访问。例如,其他地方会是 'if (gameObject.position.x > someX) { ...'
-
好吧,让我做点什么,给我几分钟。
标签: objective-c macros