目标C的宏

时间:2014-06-02 04:49:13

标签: objective-c xcode macros

我想编写一个宏来生成如下所示的两种方法:

- (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的值(字符串值)。

如何为此编写宏?我更喜欢第一个或第二个。感谢。

1 个答案:

答案 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: