Операторы Switch и распределение переменных экземпляра в Objective-C - PullRequest
9 голосов
/ 23 января 2012

Кажется, у меня проблема с созданием новых локальных переменных внутри оператора switch.Я думал, что это было что-то в заголовках моего класса, но даже получал ошибки, пытаясь выделить новый NSObject.Вот мой синтаксис:

-(NSArray *)charactersFromChapter:(NSInteger)number {
    NSObject *noError = [[NSObject alloc] init];
    //line above does not cause error
    NSArray *characters;
    switch (number) {
        case 1:
            NSObject *obj = [[NSObject alloc] init];
            //error happens in line above (Expected expression)
            characters = [NSArray arrayWithObject:obj];
            break;
        case 2:

            break;
        case 3:

            break;
    }
    return characters;
}

Ответы [ 3 ]

32 голосов
/ 23 января 2012

В операторе switch вы не можете инициализировать переменные без предварительной установки области действия, поэтому, чтобы исправить это, сделайте что-то вроде этого:

switch (some_expression) {
   case case_1:
   { // notice the brackets
       id some_obj = [MyObj new];
       break;
   }
   default:
       break; 
} 
5 голосов
/ 23 января 2012

Вам нужно либо объявить "obj" вне оператора switch, либо использовать фигурные скобки следующим образом:

switch (number) {
    case 1: {
        NSObject *obj = [[NSObject alloc] init];
        //error happens in line above (Expected expression)
        characters = [NSArray arrayWithObject:obj];
        break;
    }

Дополнительную информацию смотрите здесь: Почему переменные не могут быть объявлены воператор переключения?

1 голос
/ 23 января 2012

В коммутаторе вы можете использовать только выражения.

Вы можете исправить это, используя что-то вроде этого:

case 1:
{
       NSObject *obj = [[NSObject alloc] init];
       characters = [NSArray arrayWithObject:obj];
       break;
}
...