如何在iOS中避免使用NSString过多的if-else语句?

时间:2014-09-04 02:30:11

标签: ios objective-c if-statement nsstring

大家好,我想使用iOS8的新APN来处理通知操作。在这种方法中:

- (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 个答案:

答案 0 :(得分:5)

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

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应声明为成员变量,因此只会初始化一次。

答案 1 :(得分:2)

只要您正确命名处理程序方法,就可以使用这样的方法 -

- (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 {
  ....
}

等等。

注意,此技术将生成编译器警告。因为看到this question的答案的原因 - 如果您的方法返回void,您可以忽略警告。

答案 2 :(得分:0)

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

有些程序员不喜欢这种模式说“太多” 我不明白这个“太多”点的基础是什么 对谁来说太多了?打字员?键盘硬件?

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