Могу ли я объявлять переменные внутри оператора switch Objective-C?

Я думаю, что буду слепым, потому что я не могу понять, где синтаксическая ошибка в этом коде:

if( cell == nil ) {
    titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero
        reuseIdentifier:CellIdentifier ] autorelease
    ];

    switch( cellNumber ) {
        case 1:
            NSString *viewDataKey = @"Name";
etc...

Когда я пытаюсь скомпилировать его, я получаю ошибку: синтаксическая ошибка перед токеном '*' в последней строке.

Извините за такой базовый вопрос, но чего мне не хватает?

Ответ 1

У меня нет подходящего компилятора Objective-C, но до тех пор, пока конструкции C идентичны:

switch { … } дает вам один объемный уровень блока, а не один для каждого case. Объявление переменной в любом месте, кроме начала области, является незаконным, а внутри switch особенно опасно, потому что его инициализация может быть перепрыгнута.

Вы можете решить одно из следующих проблем:

NSString *viewDataKey;
switch (cellNumber) {
    case 1:
        viewDataKey = @"Name";
    …
}

switch (cellNumber) {
    case 1: {
        NSString *viewDataKey = @"Name";
        …
    }
    …
}

Ответ 2

Вы не можете объявить переменную в начале оператора case. Сделайте тестовый пример, который состоит из этого, и вы получите ту же ошибку.

Это не связано с объявлением переменных в середине блока - даже при принятии стандарта, который допускает, что GCC не примет декларацию в начале оператора case. Похоже, что GCC рассматривает метку case как часть строки и, следовательно, не позволяет там декларировать.

Простым обходным решением является просто положить точку с запятой в начале дела, чтобы объявление не начиналось.

Ответ 3

В C вы можете объявлять переменные только в начале блока перед любыми заявлениями, не объявляемыми.

{
   /* you can declare variables here */

   /* block statements */

   /* You can't declare variables here */
}

В С++ вы можете объявлять переменные где угодно.

Ответ 4

Нельзя ли объявить переменную в блоке коммутатора?

Ответ 5

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

Пример:

switch(number){

    case 1:
        {
            // Create object here
            // object is defined only for the scope of this block
        }
        break;
    case 2:
        {
            // etc.
        }
        break;
    default:
        break;

}

Ответ 6

Как решить предупреждение:

1.Вставьте одну ; в первой строке блока вашего дела

2. Коды кода внутри фигурных скобок