Могу ли я объявлять переменные внутри оператора 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. Коды кода внутри фигурных скобок