我有一些宏定义如下:
#define text @"play"
#define text_s @"stop"
#define text_f @"forward"
#define text_r @"rewind"
#define text_m @"mute"
我的NSArray
填充了@""
,@"_s"
,@"_f"
,@"_r"
,@"_m"
等字符串。
因此,在运行时期间,我想将此数组中的一个字符串与宏名称连接起来,例如@"text"
。
换句话说,我想通过将条件(即“文本”)与@""
,@"_s"
,@"_f"
,{{1连接起来 - 根据条件获取相应的宏}},@"_r"
并相应地获取宏。
到目前为止,我试图使用:
@"_m"
但这只会使用宏文本连接字符串(例如,如果它是@“stop”) 它将成为“playstop”。
我想要存档的是能够连接字符串(即前缀)并形成宏名称并相应地使用它。
例如:如果使用label.text = [NSString stringWithFormat:@"%@%@", text, [myArray objectAtIndex:<INDEX>]];
,我会获得宏@"_s"
,如果使用text_s
,则会使用宏@"_f"
。
我如何存档?如何在运行时使用字符串(即text_f
)连接宏名称?
答案 0 :(得分:3)
您可以创建一个接受变量的宏,并根据输入分配字符串。 (这也可能是一个全局函数,但是因为你坚持使用宏是一个选项:
#define getText(a) \
[a isEqualToString:@""] ? @"play" : \
[a isEqualToString:@"_s"] ? @"stop" : \
[a isEqualToString:@"_f"] ? @"forward" : \
[a isEqualToString:@"_r"] ? @"rewind" : \
[a isEqualToString:@"_m"] ? @"mute" : \
@""
你可以这样称呼:
NSString *string = getText(@"_s");
//string is now @"stop"
这会有点慢,但它会完成工作。这将是缓慢的,因为如果您想要静音宏,它必须首先检查您发送的字符串与其他4个字符串。每秒呼叫这一千次将是缓慢的,但如果你每分钟只需要一次,那么它根本不重要。同样,对于这种类型的行为有更好的选择,但是如果你需要这个解决方案,它可以工作。
需要说的是,这个宏不能在编译时使用,只能在运行时使用。因此,如果您需要能够在.h文件中使用的内容,则不会这样做。
更好的解决方案是将这些字符串添加到数组中,而不是添加@"_m", @"_r"
等。创建数组时,只需使用最终数据填充它,而不是永远不会更改的临时数据集。我对您的应用程序知之甚少,并且需要为您提供满足您需求的最佳解决方案。你只需找到有效且安全的东西。
根据您的信息进行更新:
最好的情况是将所有宏重写为更有用的信息,但因为这是针对学校而且性能不是最优先的......
#define text @"play"
#define text_s @"stop"
#define text_f @"forward"
#define text_r @"rewind"
#define text_m @"mute"
#define getText(a) \
[a isEqualToString:@""] ? text : \
[a isEqualToString:@"_s"] ? text_s : \
[a isEqualToString:@"_f"] ? text_f : \
[a isEqualToString:@"_r"] ? text_r : \
[a isEqualToString:@"_m"] ? text_m : \
@""
或:
#define text @"play"
#define text_s @"stop"
#define text_f @"forward"
#define text_r @"rewind"
#define text_m @"mute"
yourClassDictionary = @{ @"" : text,
@"_s": text_s,
@"_f": text_f,
@"_r": text_r,
@"_m": text_m };
字典将是最快的。要么适合你的情况。
答案 1 :(得分:1)
如果你实际上不必使用宏,我会做这样的事情......
NSDictionary *text = @{ @"" : @"play",
@"_s": @"stop",
@"_f": @"forward",
@"_r": @"rewind",
@"_m": @"mute" };
然后获取这样的值:
text[suffix];
其中后缀是@""
,@"_s"
等