Объективные операторы C и именованные целочисленные константы - PullRequest
10 голосов
/ 20 декабря 2010

У меня есть контроллер, который служит делегатом для двух скролл-представлений, которые размещаются в представлении, управляемом вышеупомянутым контроллером представления.

Чтобы различать два вида прокрутки, я пытаюсь использовать оператор switch (вместо простого сравнения указателей с оператором if). Я пометил оба вида прокрутки как 0 и 1, как это

NSUInteger const kFirstScrollView = 0;
NSUInteger const kSecondScrollView = 1;

Когда я пытаюсь использовать эти константы в операторе switch, компилятор говорит, что операторы case не являются константами.

switch (scrollView.tag) {
    case kFirstScrollView: {
      // do stuff
    }
    case kSecondScrollView: {
      // do stuff
    }
}

Что я делаю не так?

Ответы [ 2 ]

16 голосов
/ 20 декабря 2010

Эту проблему можно решить с помощью анонимного (хотя и не обязательно) enum типа:

enum {
    kFirstScrollView = 0,
    kSecondScrollView = 1
};

switch (scrollView.tag) {
    case kFirstScrollView: {
      // do stuff
    }
    case kSecondScrollView: {
      // do stuff
    }
}

Это будет скомпилировано без ошибок.

8 голосов
/ 20 декабря 2010

Это потому, что оператор case требует константного выражения. Теперь в C и, следовательно, в Obj-C создание переменной const не создает истинную константу. Таким образом, вы получаете эту ошибку. Но если вы используете C ++ или Obj-C ++, тогда это будет работать.

Имеется еще несколько подсказок здесь и здесь .

...