当前位置:  开发笔记 > 编程语言 > 正文

在switch语句中使用NSString

如何解决《在switch语句中使用NSString》经验,为你挑选了4个好方法。

可以NSStringswitch声明中使用吗?

或者只是使用if/ else if



1> 小智..:

我在我的应用程序中使用这些宏.

#define CASE(str)                       if ([__s__ isEqualToString:(str)]) 
#define SWITCH(s)                       for (NSString *__s__ = (s); ; )
#define DEFAULT   

SWITCH (string) {
    CASE (@"AAA") {
        break;
    }
    CASE (@"BBB") {
        break;
    }
    CASE (@"CCC") {
        break;
    }
    DEFAULT {
        break;
    }
 }


如果您忘记中断,这将导致无限循环.可能更好地做一个do/while,或者创建另一个计数器变量,当它到达它时会自动打破它.另一个缺点是它看起来不像转换语句.考虑使用`__COUNTER__`创建一个案例标签,允许您拥有看起来更像真正的switch语句的代码.最后,我会为你的宏添加前缀,以确保它们不会发生冲突,像"DEFAULT"这样的名称肯定会与某个库中的库发生冲突.

2> Vladimir..:

switch语句需要整数常量,因此NSString不能在这里使用,所以你似乎必须使用if/else选项.

还有一点是你必须使用isEqualToString:或compare:方法比较NSStrings,所以即使允许指针值用于开关案例,你仍然无法使用它们


@ SK9既不是,也不调用选择器,因为你无法在nil对象上调用选择器.

3> Alex Gray..:

作为回应和支持@Cœur的答案..这是同样的事情,但用Xcode 4.4+编写/ clang/ 无论什么 "文字语法" 更接近简单的urnary if, else比较(这就是重点,不是...... ..)

NSDictionary *actionD = @{ @"A" : ^{ NSLog(@"BlockA!"); }, 
                           @"B" : ^{ NSLog(@"BlockB!"); }};

((void(^)()) actionD[@"A"])(); 

BlockA!

或者说,你想根据按钮的标题执行一个选择器......

- (IBAction) multiButtonTarget:button { 

((void (^)())                           // cast
  @{ @"Click?" : ^{ self.click; }, 
     @"Quit!"  : ^{   exit(-1); }}      // define
        [((NSButton*)button).title])    // select
                                    (); // execute
}

Quit!exit -1

简短,喜欢 w.string = kIvar == 0 ? @"StringA" : @"StringB";,并且更有用,因为你可以在那里推动积木,甚至没有想到一些可怕的(有限的,复杂的)@selector!

编辑:这显然是这样构造的:

[@[ @"YES", @"NO", @"SIRPOOPSALOT"] do:^(id maybe) {
    [maybe isEqual:@"YES"] ? ^{ NSLog(@"You got it!"); }()
  : [maybe isEqual:@"NO" ] ? ^{ NSLog(@"You lose!!!"); }() 
  :                          ^{ NSLog(@"Not sure!"); [self tryAgain]; }();
}]; 

*** You got it! ****** You lose!!! ****** Not sure! ***

我不得不承认,我很尴尬 INTO这种语法愚蠢的.另一个选择是忘记字符串是什么..只是执行它,哈哈...

[ @{ NSApplicationWillBecomeActiveNotification : @"slideIn",
     NSApplicationDidResignActiveNotification  : @"slideOut" } each:^( id key, id obj ) {
    [w observeObject:NSApp forName:obj calling: NSSelectorFromString ( obj ) ];       
}];

或者从UI的角度来看,字面上......

- (IBAction)setSomethingLiterallyWithSegmentedLabel:(id)sender {
   NSInteger selectedSegment = [sender selectedSegment];
   BOOL isSelected = [sender isSelectedForSegment:selectedSegment];
   BOOL *optionPtr = &isSelected;
   SEL fabricated = NSSelectorFromString
       ([NSString stringWithFormat:@"set%@:",[sender labelForSegment:selectedSegment]]);
   [self performSelector:fabricated withValue:optionPtr];
}



4> Cœur..:

Switch语句不适用于NSString:它只适用于int.

如果/ Else语句代码太多而且通常不是最佳的.

最佳解决方案是使用由NSString(或其他对象)可能性索引的NSDictionary.然后直接访问正确的值/功能.

例1,当你想测试@"A"或@"B"并执行methodA或methodB时:

NSDictionary *action = @{@"A" : [NSValue valueWithPointer:@selector(methodA)],
                         @"B" : [NSValue valueWithPointer:@selector(methodB)],
                         };
[self performSelector:[action[stringToTest] pointerValue]];

例2,当你想测试@"A"或@"B"并执行blockA或blockB时:

NSDictionary *action = @{@"A" : ^{ NSLog (@"Block A"); },
                         @"B" : ^{ NSLog (@"Block B"); },
                         };
((void (^)())action[stringToTest])();

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有