我想写一个宏来检查宏之间的if语句是否是唯一的
宏之间的语句如下
if([myString isEqualToString:@"one"]){
//do something
}
if ([myString isEqualToString:@"two"]){
//do two somethings
}
我想把我的ifs放在某个东西中,以确保我没有两个ifs在这个区块内检查相同的东西。
这可能吗?
修改 我希望我的宏可以执行以下操作
在对象o上启动宏
使用键" o"创建一个字典。和价值
对于宏括号之间的每个if语句,"值"在给定数组中检查它是否存在,将其推入,否则给出一个#warning类型宏,表明该值已经在里面。
结束宏并从内存中删除上述字典。
答案 0 :(得分:2)
这是一个更大的关注点,确保您安全地处理类似字符串的比较。关注是好的,但宏完全是试图解决它的错误工具。
正确的工具是switch
,它正好用于处理“我想从列表中挑选一些东西”。编译器为您提供switch
的各种支持,包括确保您不重复,并且您的检查是详尽的。但switch
不适用于字符串。没关系。它只是意味着我们必须把我们的字符串变成一个枚举,这对于除了这个特别关注之外的各种事情都有好处。
最重要的是尽可能快地摆脱@"one"
,并将其转换为类型可检查的内容,例如OptionOne
枚举案例。
typedef enum _Options {
OptionUnknown = 0, // This one must be zero; rest don't matter
OptionOne,
OptionTwo,
OptionThree
} Options;
NSDictionary *options = @{@"one": @(OptionOne),
@"two": @(OptionTwo),
@"three": @(OptionThree)
};
现在很容易做你想做的事:
switch ([options[myString] intValue]) {
case OptionUnknown:
NSLog(@"I don't know that option");
break;
case OptionOne:
NSLog(@"Thanks for option 1");
break;
default:
NSLog(@"Meh; who cares about these options?");
break;
}
请注意,我在这里依赖于ObjC nil-messaging。如果options[x]
不在字典中,则nil
为x
。在类似整数的上下文中返回时,[nil intValue]
为0。因此,通过使我们的“未知”案例为0,我们可以跳过很多繁琐且容易出错的检查,看看该值是否在字典中。