Как уже говорили другие, если вы захотите это сделать, тогда вам следует подумать о том, как лучше структурировать ваши данные.Похоже, вы имеете дело со скалярными типами.Я нахожу, что немного с ++ проходит долгий путь, и вы можете интегрировать его в проект Objective-C с помощью Objective-C ++.Тем не менее, если вы уверены, что хотите то, что, как вы говорите, вы хотите, и вы не противны злу с препроцессором, вы можете попробовать что-то вроде этого:
#define BEGIN_SWITCH(type,...) ({ typedef type T; T switchVars[] = { __VA_ARGS__ }; BOOL performAction;
#define CASE(...) { \
T caseVars[] = { __VA_ARGS__ }; \
performAction = YES; \
size_t count = MIN(sizeof(switchVars), sizeof(caseVars)) / sizeof(T); \
for (size_t i = 0 ; i < count / sizeof(T) ; i++) \
{ \
if (caseVars[i] != switchVars[i]) \
{ \
performAction = NO; \
break; \
} \
} \
} \
if (performAction)
#define END_SWITCH });
int main (int argc, char const *argv[])
{
id pool = [[NSAutoreleasePool alloc] init];
int a1 = 0;
int a2 = 5;
int a3 = 10;
BEGIN_SWITCH(int, a1, a2, a3)
CASE(0,5) NSLog(@"0,5");
CASE(1,2,3) NSLog(@"1,2,3");
CASE(0,5,10) NSLog(@"0,5,10");
CASE(1) NSLog(@"1");
END_SWITCH
[pool drain];
return 0;
}
Это не совсем похоже на переключатель/ case, так как вы не можете сложить несколько выражений case: поверх одного другого.В любом случае вам нужно было бы добавить по умолчанию и разбить как-нибудь - возможно, вы могли бы сделать это с некоторыми дополнительными макросами и переходом на разрыв.Применяются стандартные предостережения, касающиеся препреоцессора: он не так хорош, как Objective-C, и будет склонен давать вам все виды непостижимых синтаксических ошибок.Но если вы действительно хотите изменить синтаксис языка, то вы можете выбрать что-то вроде этого или получить работу в Apple.