Your switch statements aren't really arbitrary, they just could have an arbitrary length. For a broad number of lengths, you could go ahead and declare them for the benefit of the compiler (and you'd then get error checking, which you wouldn't if you just turned off the warning). For example:
typedef void (^ObjCCaseBlock)();
@interface NSObject ()
- (id)switch;
- (void)case:(NSString*)a :(ObjCCaseBlock)b;
- (void)case:(NSString*)a :(ObjCCaseBlock)b case:(NSString*)a :(ObjCCaseBlock)b;
- (void)case:(NSString*)a :(ObjCCaseBlock)b case:(NSString*)a :(ObjCCaseBlock)b case:(NSString*)a :(ObjCCaseBlock)b;
@end
Repeat for as many levels as is likely to occur (and you could add levels if it ever bumped into a problem). It's a little bit tedious, but not difficult.