2013-08-11 6 views
-5

В течение последних нескольких часов я пытался сделать что-то, что имеет для меня смысл, но не для Xcode, и я до сих пор не понял, как это сделать Это. Итак, вот оно.Присвоение возвращаемого значения метода класса переменной ошибке

NSArray *array = [MedInfo getCategoryFirstIndexArray];

Здесь getCategoryFirstIndexArray просто метод класса MedInfo:

@interface MedInfo : NSObject 
+(NSArray *)getCategoryFirstIndexArray; 
@end 

Но Xcode это твердит меня есть ошибка в коде, говоря «Прогнозное выражение» ?? Забавно, если я ставлю только [MedInfo getCategoryFirstIndexArray];, компилятор говорит, что все в порядке, но как только я пытаюсь присвоить возвращаемое значение другой переменной, возникает ошибка.

Так что я делаю неправильно здесь? Я слишком много спрашиваю?

EDIT: Хорошо, это глупо. Я пытался сделать новую переменную внутри переключателя заявление, что-то вроде этого:

switch(self.viewType.integerValue) 
{ 
    case 0: 
     break; 
    default: 
     NSArray *array = [MedInfo getCategoryFirstIndexArray]; 
     break; 
} 

И, видимо, я не знал, что Objective-C не поддерживает, что (еще одна причина ненавидеть этот ужасающий язык) , Извините за мое невежество, и спасибо вам, кто бы вы ни пытались помочь! До свидания!

+1

@KyrDunenkoff Постарайтесь быть полезными, не будучи грубым.Необходимо использовать фигурные скобки только в том случае, если первая строка блока case/default объявляет переменную - довольно тонкая битка знаний. Обнаружение этого количества информации в «документации» не будет простой задачей для всех. – rmaddy

+0

@rmaddy 's/документация/разумное руководство для начинающих /', Кир абсолютно прав. (Кроме того, OP мог бы получить сообщение об ошибке в google. Это то, что я всегда делал с моими новичками. Гарантированное мгновенное решение в течение 10 минут, не тратя драгоценное время другим ... –

+1

@ H2CO3 Это все еще не повод для грубости. Любая помощь (без грубости) или downvote из-за отсутствия усилий. – rmaddy

ответ

3

Здесь есть две разные проблемы.

  1. Ни С, ни Objective-C позволяет декларацию переменного непосредственно после наклейки (см Declaring variables inside a switch statement или этого ответа: https://stackoverflow.com/a/1115323/1187415). Таким образом,

    switch (k) { 
        case 10: 
         break; 
        default: 
         int x = 20; // ERROR: Expected expression 
         break; 
    } 
    

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

    default: ; 
         int x = 20; 
         break; 
    

    и это работает в обоих C и Objective-C. Итак, один может объявить переменные внутри инструкция switch без использования скобок { ... }.

  2. С Automatic-Reference Counting это не работа больше для Objective-C объектов (сравните When converting a project to use ARC what does "switch case is in protected scope" mean?):

    switch (k) { 
        case 10: ; 
         NSMutableArray *a = [NSMutableArray array]; 
         // ... 
         break; 
        default: // ERROR: Switch case is in protected mode 
         break; 
    } 
    

    Причина заключается в том, что АРК компилятор должен хорошо -defined scope для управления временем жизни объекта . И Теперь единственным решением является введение дополнительного объема с { ... }:

    switch (k) { 
        case 10: { 
          NSMutableArray *a = [NSMutableArray array]; 
          // ... 
         } 
         break; 
        default: // Switch case is in protected mode 
         break; 
    } 
    

Так что это еще вопрос, ARC, чем проблема Objective-C.

Смежные вопросы