2

私が理解できない最も奇妙な問題があります。以下のメソッドでは、switch ステートメントは入力されていません。の値を出力するwarningAlertViewTypeと正しいのですが、何らかの理由で switch ステートメントがアクティブになりません。これと同じ方法論を以前にスイッチに使用したことがありますが、うまくいきました。

これを引き起こすために何が起こっているのか誰かが知っていますか?

+ (WarningAlertView*) warningAlertViewWithType:(WarningAlertViewType)warningAlertViewType
    {
        WarningAlertView *warningAlertView = nil;
        NSLog(@"WarningAlertViewType1: %d", warningAlertViewType);
        switch (warningAlertViewType)
        {
                NSLog(@"Test1");
            case WarningAlertViewTypeExit:                  warningAlertView = [[ExitWarningAlertView alloc] init]; break;
            case WarningAlertViewTypeFacebook:              warningAlertView = [[FacebookWarningAlertView alloc] init]; break;
            case WarningAlertViewTypeDelete:                warningAlertView = [[DeleteWarningAlertView alloc] init]; break;
            case WarningAlertViewTypePhotoLibrary:          warningAlertView = [[PhotoLibraryWarningAlertView alloc] init]; break;
            case WarningAlertViewTypeBack:                  warningAlertView = [[BackWarningAlertView alloc] init]; break;
            default: break;
        }
        NSLog(@"Test2");
        return [warningAlertView autorelease];
    }
4

1 に答える 1

1

switch ステートメントを次のように変更します

switch (warningAlertViewType) {

 case WarningAlertViewTypeExit:
   NSLog(@"WarningAlertViewTypeExit");
   warningAlertView = [[ExitWarningAlertView alloc] init];
   break;

 case WarningAlertViewTypeFacebook:
   NSLog(@"WarningAlertViewTypeFacebook");
   warningAlertView = [[FacebookWarningAlertView alloc] init];
   break;

 case WarningAlertViewTypeDelete:
   NSLog(@"WarningAlertViewTypeDelete");
   warningAlertView = [[DeleteWarningAlertView alloc] init];
   break;

 case WarningAlertViewTypePhotoLibrary:
   NSLog(@"WarningAlertViewTypePhotoLibrary");
   warningAlertView = [[PhotoLibraryWarningAlertView alloc] init];
   break;

 case WarningAlertViewTypeBack:
   NSLog(@"WarningAlertViewTypeBack");
   warningAlertView = [[BackWarningAlertView alloc] init];
   break;

 default:
   NSLog(@"default");
   break;
}

私は実際、このような厳密なネーミングのファンです。次に、これを大幅に短縮するためにマクロを使用できます (嫌いな人もいますが、私は知っています)。

switch (warningAlertViewType) {

#define CASE(_type) \
case WarningAlertViewType ## _type: \
  NSLog(@"WarningAlertViewType" #_type); \
  warningAlertView = [[_type ## WarningAlertView alloc] init]; \
  break

CASE(Exit);
CASE(Facebook);
CASE(Delete);
CASE(PhotoLibrary);
CASE(Back);

default:
  NSLog(@"default");
  break;

#undef CASE

}
于 2013-04-09T22:58:26.103 に答える