提问者:小点点

如何在iOS中避免太多带NSString的if-else语句?


嗨,伙计们,我想使用iOS8的新APNs apis来处理通知操作。在这种方法中:

- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
     forRemoteNotification:(NSDictionary *)notification
         completionHandler:(void (^)())completionHandler {

      if ([identifier isEqualToString:@"ACCEPT_IDENTIFIER"]) {
          [self handleAcceptActionWithNotification:notification];
      }
      else if([identifier isEqualToString:@"MAYBE_IDENTIFIER"]) {
          [self handleMaybeActionWithNotification:notification];
      }
      else if ([identifier isEqualToString:@"REJECT_IDENTIFIER"]) {
          [self handleRejectActionWithNotification:notification];
      }
      else if....blah blah blah..
}

在这种情况下,我将来可能不得不用NSString编写太多的if-else语句,我知道一些方法来避免太多的if-else,例如使用switch,但这不适用于字符串或NSString情况。

是否有任何解决方案可以避免在此字符串或 NSString 案例中写入太多 if-else 语句?提前谢谢。


共3个答案

匿名用户

您可以将所有选择器放在字典映射中

NSDictionary* handleMap = @{ 
    @"ACCEPT_IDENTIFIER" : NSStringFromSelector(@selector(handleAcceptActionWithNotification:))
    @"MAYBE_IDENTIFIER" : NSStringFromSelector(@selector(handleMaybeActionWithNotification:))
    @"REJECT_IDENTIFIER" : NSStringFromSelector(@selector(handleRejectActionWithNotification:)])
};

NSString* selString = handleMap[identifier];
if (selString) {
    SEL sel = NSSelectorFromString(selString);
    [self performSelector:sel withObject:notification];
}

handleMap应该声明为成员变量,因此它只会初始化一次。

匿名用户

只要正确命名处理程序方法,就可以使用如下方法-

- (void)application:(UIApplication *)application 
handleActionWithIdentifier:(NSString *)identifier 
forRemoteNotification:(NSDictionary *)notification 
completionHandler:(void (^)())completionHandler {

    NSString *selectorStr=[NSString stringWithFormat:@"handle%@:", identifier];


    SEL selector=NSSelectorFromString(selectorStr);

    if ([self respondsToSelector:selector]) {
       [self performSelector:selector withObject:notification];
    }
}

然后创建一系列方法,例如

-(void) handleACCEPT_IDENTIFIER:(NSDictionary *)notification {
  ....
}

-(void) handleMAYBE_IDENTIFIER:(NSDictionary *)notification {
  ....
}

等等

注意,此技术将生成编译器警告。为什么要看到这个问题的答案?在方法返回<code>void</code>的情况下,您可以忽略警告。

匿名用户

它可能看起来很多,但我认为它是一种很好的代码结构
易于阅读,易于维护
因为它是显式的,所以关键字搜索和代码浏览总是微不足道的。此外,调用方图生成和静态分析将更加彻底(有限制)。

一些程序员不喜欢这种模式,说“太多了”
我不明白“太多”这一点的依据
对谁来说太多了?打字爱好者?键盘硬件?

我总是喜欢简单、明确的代码。