Objective-C if vs switch

ePa*_*oal 0 if-statement objective-c switch-statement

我无法理解为什么这适用于if声明而不是switch:

if ((int)typeOfHall == 1) {//LocalHall
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Game"];
    NSPredicate *p = [NSPredicate predicateWithFormat:@"player_id == %@ ",[[NSUserDefaults standardUserDefaults] valueForKey:@"LoggedUserId"]];
    request.predicate = p;
}
Run Code Online (Sandbox Code Playgroud)

下面的代码不起作用(编译错误:( Expected expression在NSFetchRequest上)):

switch ((int)typeOfHall) {
    case 1:
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Game"]; //Error Expected expression
        NSPredicate *p = [NSPredicate predicateWithFormat:@"player_id == %@ ",[[NSUserDefaults standardUserDefaults] valueForKey:@"LoggedUserId"]];
        request.predicate = p;
        break;
    default:
        break;             
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会这样.我认为switch和if语句是相似的,但在这种情况下它似乎是非常不同的.

你知道为什么会这样吗?

mol*_*ilo 5

case如果要在那里声明任何变量,则需要一个单独的范围:

switch ((int)typeOfHall) {
    case 1:
    {   /* Introduce a scope ... */
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Game"]; 
        NSPredicate *p = [NSPredicate predicateWithFormat:@"player_id == %@ ",[[NSUserDefaults standardUserDefaults] valueForKey:@"LoggedUserId"]];
        request.predicate = p;
        break;
    }   /* ... that ends here. */
    default:
        break;

}
Run Code Online (Sandbox Code Playgroud)

旁注:如果LocalHall是枚举值,则代码在没有强制转换的情况下更具可读性:

switch (typeOfHall) {
    case LocalHall:
    // ...
Run Code Online (Sandbox Code Playgroud)