我想编写一个宏来生成如下所示的两种方法:
- (NSString*)propertyName
{
NSString *key = @"PropertyName";
//get value from NSUserDefaults
//...
}
- (void)setPropertyName:(NSString*)value
{
NSString *key = @"PropertyName";
//set value to NSUserDefaults
//...
}
属性名的第一个字母在get方法中是小写,在set方法和键值中是大写。
宏应该接收1或2个参数,即属性名称:
MY_PROPERTY(propertyName)
或
MY_PROPERTY(PropertyName)
或
MY_PROPERTY(propertyName, PropertyName)
参数也是key
的值(字符串值)。
如何为此编写宏?我更喜欢第一个或第二个。感谢。
答案 0 :(得分:4)
让我们生气:
#define STRINGIFY(__TEXT__) [NSString stringWithFormat:@"%s", (#__TEXT__)]
#define GENERATE_GETTER_AND_SETTER(__UPPER_CASE__, __LOWER_CASE__, __TYPE__) \
- (void)set##__UPPER_CASE__:(__TYPE__)__LOWER_CASE__ { \
NSString *propertyName = STRINGIFY(__UPPER_CASE__); \
\
...
} \
\
- (__TYPE__)__LOWER_CASE__ { \
NSString *propertyName = STRINGIFY(__UPPER_CASE__); \
\
...
return ... \
} \
用法:
GENERATE_GETTER_AND_SETTER(MyProperty, myProperty, NSArray*)
请注意,您必须同时指定小写和大写名称,并且您必须知道属性的类型。
将属性声明为@dynamic
然后动态实现方法可能更容易,有关详细信息,请参阅Objective-C forwardInvocation:。