0

如果像这样,而不是使用 else

            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**
4

2 回答 2

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”终止,否则该功能将不知道何时实际到达终点。

于 2012-12-07T07:12:33.513 回答
1

根据 ATaylor 和 ACB 的说法,字面上的答案是不。开关需要整数,充其量你最终会进行指针比较,这与isEqualToString:.

减少级联测试的句法分量和处理成本的选项if是基于字典的——原则上你可以用字符串键控的块填充字典,但是对于大多数实际目的,你需要经常创建字典,所以我倾向于填充选择器。例如

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 */
于 2012-12-07T07:26:04.967 回答