Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何编写一个宏来检查重复的if?_Objective C_Macros - Fatal编程技术网

Objective c 如何编写一个宏来检查重复的if?

Objective c 如何编写一个宏来检查重复的if?,objective-c,macros,Objective C,Macros,我想写一个宏来检查宏之间的if语句是否唯一 宏之间的语句如下所示 if([myString isEqualToString:@"one"]){ //do something } if ([myString isEqualToString:@"two"]){ //do two somethings } 我想把我的ifs放在某个东西里,以确保我没有两个ifs在这个块中检查同一个东西 这可能吗 编辑 我希望我的宏执行以下操作 在对象o上启动宏 创建带有键“o”和值的字典 对于宏括号之间的每个if语句

我想写一个宏来检查宏之间的if语句是否唯一

宏之间的语句如下所示

if([myString isEqualToString:@"one"]){
//do something
}
if ([myString isEqualToString:@"two"]){
//do two somethings
}
我想把我的ifs放在某个东西里,以确保我没有两个ifs在这个块中检查同一个东西

这可能吗

编辑 我希望我的宏执行以下操作

在对象o上启动宏 创建带有键“o”和值的字典
对于宏括号之间的每个if语句,都会在给定数组中检查“value”,如果它不在数组中,则将其推入,否则会给出一个#警告类型的宏,说明该值已经在数组中


结束宏并从内存中删除前面提到的字典。

这是一个更重要的问题,即确保安全地处理类似字符串的比较。这个问题是好的,但是宏是完全错误的工具来修复它

正确的工具是
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消息传递<如果字典中没有
x
,则code>options[x]为
nil
<代码>[nil intValue]在类似整数的上下文中返回时为0。因此,通过将“未知”情况设为0,我们可以跳过许多繁琐且容易出错的检查,以确定该值是否在字典中。

这是可能的,但为什么要麻烦呢?宏的存在是为了消除繁琐,而不是增加复杂性。我需要它;),如果我不需要它,我就不会麻烦了我从来都不需要这样的东西,所以我想你也不需要。不管怎样,这是一个自由的世界。祝你好运。你能澄清一下你想要达到的目标吗?请用您试图阻止的内容的示例更新您的问题。@rmaddy请参阅编辑我需要对不可检查的值执行此操作,我无法将其转换为枚举,因为它不是那么简单。问题可能不可能解决(至少不需要尝试用宏预处理器创建一个完整的编译器,人们这样做是为了好玩,但它非常脆弱、复杂和缓慢)。为了找到一个可能的版本,您需要更好地构建您的问题。您所描述的不太适合宏。