【发布时间】:2014-04-24 20:54:12
【问题描述】:
我想要类级别的属性,我从https://stackoverflow.com/a/15811719/157384找到了解决方案
@interface Model
+ (int) value;
+ (void) setValue:(int)val;
@end
@implementation Model
static int value;
+ (int) value
{ @synchronized(self) { return value; } }
+ (void) setValue:(int)val
{ @synchronized(self) { value = val; } }
@end
现在您可以通过属性访问器进行调用,如下所示:
Model.value = 1
Model.value // => 1
太棒了!
现在,我想以某种形式的宏或元编程使这段代码可重用,它需要一个属性名称和类型。怎么写?
对于上面的示例,value 和 (int)(和 Model)应该是动态的。
更新
感谢@Rich,我现在有了这个:
// Common.h
#define CLASS_PROPERTY_INTERFACE(TYPE, METHOD, CMETHOD) \
+ (TYPE) METHOD; \
+ (void) set##CMETHOD:(TYPE)val; \
#define CLASS_PROPERTY_IMPLEMENTATION(TYPE, METHOD, CMETHOD) \
static TYPE _##METHOD; \
+ (TYPE) METHOD \
{ @synchronized(self) { return _##METHOD; } } \
+ (void) set##CMETHOD:(TYPE)val \
{ @synchronized(self) { _##METHOD = val; } } \
// User.h
@interface User : NSObject
CLASS_PROPERTY_INTERFACE(User *, me, Me)
@end
// User.m
@implementation User
CLASS_PROPERTY_IMPLEMENTATION(User *, me, Me)
@end
User.me = currentUser;
User.me // => currentUser
如果可能的话,还有一件事是自动将传递给宏的方法名大写。
但它已经比现有的样板简洁得多了!
【问题讨论】:
-
您能否通过使其可重用(或许使用伪代码)更详细地说明您的意思?你在寻找类似
class_addProperty的东西吗? -
我想说只使用 Xcode 代码 sn-p,而不是元编程,但如果你真的想要一个宏,请查看 libextobjc 以获得灵感。
-
是否有可能在同一个头文件中有
@interface和@implementation? -
它们可以在同一个文件中没有问题,@Rich。但是,将
@implementation部分放入一个文件中,该文件会导入到多个其他文件中,这会导致链接器错误。 -
@JoshCaswell 抱歉,这就是我的意思,在头文件中包含
@implementation(它必须与宏一起使用 - 这也将定义@interface)不起作用,所以除非你像最初建议的那样使用代码 sn-p (或文件模板),否则我认为他不能做他想做的事......!
标签: objective-c cocoa metaprogramming