开关盒上的NSString

时间:2012-12-07 07:04:33

标签: ios

而不是像这样使用其他

            if([screen isEqualToString :@"A"]){

               }
             else if(screen isEqualToString:@"B"){

               }

它会像这样工作吗

          switch ([string isEqualToString:screen]){
          case ISA:
          break;

          case ISB:
          break;

          default:
          break;
       }

其中ISA和ISB定义为

       #define ISA [screen isEqualToString:A] and **will it be efficient**

2 个答案:

答案 0 :(得分:2)

不,我当然不这么认为。 switch / case是关于数字if / then / else的情况。

但您可以做的是以下内容:

编写一个函数并向其传递可变数量的参数(因为objective-c实现了C查找语法的va_args)。将原始字符串和要比较的字符串传递给它。

在该函数内部,使用'for'循环,逐个比较字符串,直到它到达结尾或根据您的标准找到匹配。

一旦满足,返回索引。您可以在switch case中使用该索引。 一个小例子:

switch([self compareStrings:@"FirstString" Options:"@FirstString", @"SecondString"]) {
    case 0: //FirstString
    break;

    case 1: //SecondString
    break;

    default: //Not found
    break;
}

那应该有用。关于你的功能:确保要么包含Optioncount,要么使'nil'选项终止,否则函数将无法知道何时实际结束。

答案 1 :(得分:1)

根据ATaylor和ACB,字面答案是否定的。开关需要整数,最多你最终会做一个指针比较,这与isEqualToString:不一样。

减少级联if测试的语法重要性和处理成本的选项是基于字典的 - 你原则上可以用字符串键入字符串填充字典但是出于大多数实际目的,你需要创建字典相当频繁,所以我倾向于填充选择器。 E.g。

NSDictionary *stringsToSelectors =
    @{
          @"A" : [NSValue valueWithPointer:@selector(doTaskA)],
          @"B" : [NSValue valueWithPointer:@selector(doTaskA)],
    };

SEL selector = [[stringsToSelectors objectForKey:string] pointerValue];
[self performSelector:selector];

...

- (void)doTaskA
{
    // etc, etc
}

如果你想要比你甚至可以更自然地动态:

NSString *selectorName = [NSString stringWithFormat:@"doTask%@", string];
SEL selector = NSSelectorFromString(selectorName);
if([self respondsToSelector:selector]) [self performSelector:selector];

...

- (void)doTaskA /* etc, etc */