我希望简化"胶水"我的应用中的代码。
我的目标是:
MAKE_KEY(keyname)
展开为
#define keyname @"keyname"
不幸的是,我很确定我不能在#define中使用#define。
所以,我的目标是扩展:
MAKE_KEY(keyname)
作为
keyname @"keyname"
所以我可以写:
#define MAKE_KEY(USER_ID)
并获取
#define USER_ID @"USER_ID"
我该怎么做?
显示您希望如何使用扩展值以帮助解决问题
我想生成#define MY_CONST @"MY_CONST"
而不输入MY_CONST这两个字(因为我有很多要处理的......)
然后,我会在代码中的任何地方使用MY_CONST
。
我之所以这样做,是因为我会有people
或cities
或plants
或animals
之类的对象......这些对象不会有很多方法,而是很多变数。这些对象需要可序列化。
有两种方法可以做到这一点:
为每个变量都有一个属性,并用编码器方法编写相应的编码(真正的痛苦)
将所有数据输入字典,然后在encodewithcoder中序列化字典。
我选择了解决方案#2。但我仍然希望拥有访问器。所以,我可以通过在字典中获取正确的值来设计一个为我编写访问器的宏。
所有这一点之间的共同点是访问者和字典的密钥都具有相同的名称。
答案 0 :(得分:0)
对于整个应用程序中使用的常量,通常认为在单个实现文件中包含字符串(或其他对象)的所有定义是最佳的(例如Constants.m
并且有一个头文件将这些实例声明为<{1}}(例如在extern
中):
Constants.h:
Constants.h
Constants.m:
extern NSString * const CONST_STRING_1;
extern NSString * const CONST_STRING_2;
extern NSString * const CONST_STRING_N;
减少打字的一种方法是:
Constants.h:
#import "Constants.h"
NSString * const CONST_STRING_1 = @"CONST_STRING_1";
NSString * const CONST_STRING_2 = @"CONST_STRING_2";
NSString * const CONST_STRING_N = @"CONST_STRING_N";
Constants.m:
#define EXCONST(name) extern NSString * const name
#define CONST(name) NSString * const name = @#name
EXCONST(CONST_STRING_1);
EXCONST(CONST_STRING_2);
EXCONST(CONST_STRING_N);
然后,您只需使用名称
即可引用这些常量字符串#import "Constants.h"
CONST(CONST_STRING_1);
CONST(CONST_STRING_2);
CONST(CONST_STRING_N);
注意:这是未经测试的,因此可能出现错误。