在我的项目中,我通常有一个复合对象(GameObject),它需要将 ivar 的一些属性公开到 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; } \
那里有任何宏向导可以提供帮助吗?其次,有没有办法不需要向宏提供属性的类型?