我正在努力节省一些时间/让我的代码可读。我有很多返回BOOL的'isXXX'消息。我不断添加更多'是'消息。是否可以通过列表创建一个可在编译前编译时扩展的宏。
我想指明: isMacro(1,2,3)。
对于每一个,我希望宏将其扩展为完整 - (BOOL)is1 {...}, - (BOOL)is2 ...
这似乎很好地利用了预编译器宏扩展,但我不确定如何实现isMacro(...)部分。 (具体来说,......在编译之前会扩展为完整的函数)。
---更新:
'is'方法都是动态计算的,但它们都很常见。
我正在针对枚举值测试单个变量并确定它是否相等。我不能@synthesize他们,因为它是动态的。为方便起见,我将所有这些都放在@property中。我想要的东西就像@synthesize,我可以在其中列出所有这些,并为每个isXXX方法创建一个动态响应。
另外,我不想运行isCheck:(opMode)模式,因为没有预编译检查以确保它是有效的枚举值。
所有功能都采用以下格式:
-(BOOL) isTurtle { return operationMode == Turtle; }
关键是我希望它作为一个简单的属性。因此,我不想要像:(opMode)模式,我必须指定BOOL res = [obj is:Tutle];
答案 0 :(得分:2)
如果您可以使用Boost.Preprocessor,BOOST_PP_REPEAT_FROM_TO宏应该符合您的需要。
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
#define IS_METHODS(depth, n, aux) -(BOOL)is ## n { return aux == n; }
@implementation Foo
BOOST_PP_REPEAT_FROM_TO(1, 31, IS_METHODS, operationMode)
@end
如果你做不到,那你就不走运了。实现BOOST_PP_REPEAT_FROM_TO与直接编写30多个函数大致相同。
此外,我还没有看到[obj isMode:12]
比obj.is12
更糟糕。前者也允许变量模式,并且对其他程序员来说不那么神秘(想想维护工作)。