Операторы переключения Objective C и именованные целочисленные константы

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

Чтобы различать два представления прокрутки, я пытаюсь использовать оператор 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
    }
}

Что я делаю неправильно?


person Eimantas    schedule 20.12.2010    source источник
comment
Сделайте ваши константы также статическими; проблема с компилятором, я уверен, но это, кажется, исправлено. По какой-то причине компилятор не считает, что просто const действительно константа, а const static является. Я уверен, что где-то в документах есть какая-то странная абстрактная причина   -  person Albert Renshaw    schedule 29.06.2018


Ответы (2)


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

enum {
    kFirstScrollView = 0,
    kSecondScrollView = 1
};

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

Это скомпилируется без ошибок.

person Sedate Alien    schedule 20.12.2010
comment
Это работоспособное решение, и я его использую, но я не понимаю, почему константы не работают. - person Matthew Frederick; 20.12.2010

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

Еще несколько советов доступны здесь и здесь.

person taskinoor    schedule 20.12.2010
comment
Итак, как мы можем создавать константы в Objective-C? #define MY_CONSTANT 123 будет одним из способов, но единственный ли он? - person nacho4d; 20.12.2010
comment
определить и перечислить. Оба они создают истинную константу в C/Obj-C. - person taskinoor; 20.12.2010