使用NSString连接宏名称

时间:2014-07-30 14:14:36

标签: ios objective-c macros

我有一些宏定义如下:

#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)连接宏名称?

2 个答案:

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

之一