Objective c 复杂预处理器宏

Objective c 复杂预处理器宏,objective-c,macros,c-preprocessor,Objective C,Macros,C Preprocessor,我正在创建一个UIColor类别,其中有一组颜色,我想轻松访问,然后缓存 这是我创建颜色的基本方法: #define RGB(r, g, b) [self colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1] // [..] + (instancetype)pigletColor { static UIColor *pigletColor = nil; if (!pigletColor) {

我正在创建一个
UIColor
类别,其中有一组颜色,我想轻松访问,然后缓存

这是我创建颜色的基本方法:

#define RGB(r, g, b) [self colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]

// [..]

+ (instancetype)pigletColor
{
    static UIColor *pigletColor = nil;
    if (!pigletColor) {
        pigletColor = RGB(237.0, 0.0, 130.0);
    }
    return pigletColor;
}
然而,重复上述十次并不是很简单,所以我试图创建一个宏,让我可以轻松地完成这项工作

理想情况下,我想用
COLORGETTER(Pieget,234.0,0.0,130.0)
替换上面的内容。我试过了,但没能成功。就我所知:

#define COLORGETTER(name, red, green, blue)\
+ (instancetype *)##name##Color\
{\
    static UIColor *##name##Color = nil;\
    if (!##name##Color) {\
        ##name##Color = RGB(red, green, blue);\
    }\
    return ##name##Color;\
}
但是,上面的操作不起作用,因为我无法理解
/
运算符

有什么想法吗?

有两个错误:

  • (instancetype*)
    应该是
    (instancetype)
    。与
    id
    类似,这已经是一个指针
  • #####Color
    应该是
    name##Color
    。您想连接名称和“颜色” 指向单个标记,但不指向前面的标记
所以这似乎是可行的:

#define COLORGETTER(name, red, green, blue)\
    + (instancetype) name##Color\
    {\
        static UIColor * name##Color = nil;\
        if (!name##Color)\
        {\
            name##Color = RGB(red, green, blue);\
        }\
        return name##Color;\
    }
几件事

  • instancetype
    已经是指针,不要使用
    instancetype*
  • 您只需要在标识符之间使用
    ##
    名称##颜色
    ,而不是
    #名称##颜色
  • 您应该真正使用
    dispatch\u once
    块,而不是
    if
  • 可选,但您并不真正需要本地人的自定义名称。只使用一个名字更容易

  • 不错!在此之后,我的提交包括37次添加和223次删除。。谢谢有24种颜色的吸气剂,我可以简化。:)
    #define COLORGETTER(name, red, green, blue)\
    + (UIColor *)name##Color\
    {\
        static UIColor *color = nil;\
        static dispatch_once_t onceToken;\
        dispatch_once(&onceToken, ^{\
            color = RGB(red, green, blue);\
        });\
        return color;\    
    }