【问题标题】:switch case on NSString in objective c [duplicate]在目标c中切换NSString的大小写[重复]
【发布时间】:2013-09-28 14:00:11
【问题描述】:

我想使用带有 NSString 的 case 语句 请将我的代码更改为正确的代码

NSString *day = @"Wed";

switch (day) {
    case @"Sat":
        NSlog(@"Somthing...");
        break;

    case @"Sun":
        NSlog(@"Somthing else...");
        break;  
        .
        .
        .
        .

    default:
        break;
}

【问题讨论】:

  • 是的,这是另一个问题的重复,但我认为这里接受的答案更好。
  • Apple 在 Swift 中解决了这个问题。

标签: objective-c nsstring switch-statement


【解决方案1】:

如果您想要比一长串条件更智能的调度,您可以使用块字典:

NSString *key = @"foo";

void (^selectedCase)() = @{
    @"foo" : ^{
        NSLog(@"foo");
    },
    @"bar" : ^{
        NSLog(@"bar");
    },
    @"baz" : ^{
        NSLog(@"baz");
    },
}[key];

if (selectedCase != nil)
    selectedCase();

如果您有很长的案例列表并且您经常这样做,那么这可能会带来很小的性能优势。然后,您应该缓存字典(并且不要忘记复制块)。

为了方便和简洁而牺牲了易读性,这里有一个版本,它将所有内容都放在一个语句中并添加了默认情况:

((void (^)())@{
    @"foo" : ^{
        NSLog(@"foo");
    },
    @"bar" : ^{
        NSLog(@"bar");
    },
    @"baz" : ^{
        NSLog(@"baz");
    },
}[key] ?: ^{
    NSLog(@"default");
})();

我更喜欢前者。

【讨论】:

  • +1 不错。我完全赞成分离数据和代码。
  • 太棒了。你能解释一下这段代码吗
  • 那是一段很酷的代码。您几乎已经创建了另一个控制结构。
  • @nmokkary 代码创建一个 NSDictionary 字面量的代码块,以字符串大小写为键。然后它返回键入key 变量的代码块。然后,如果返回的代码块不是 nil,则执行它。
  • 聪明,但极难阅读。诅咒你,阻止语法!我会坚持 if/else。
【解决方案2】:

Switch 语句不适用于 NSString,只能用于整数。使用if else

NSString *day = @"Wed";

if([day isEqualToString:@"Sat"]) {
        NSlog(@"Somthing...");
       }
else if([day isEqualToString:@"Sun"]) {
        NSlog(@"Somthing...");
       }
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2011-08-01
    • 2013-11-01
    相关资源
    最近更新 更多