10

I have a controller which serves as a delegate to two scrollviews which are placed in view managed by aforementioned view controller.

To distinguish between two scroll views I'm trying to use switch statement (instead of simple pointer comparison with if statement). I have tagged both scroll views as 0 and 1 like this

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

When I try to use these constants in a switch statement, the compiler says that case statements are not constants.

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

What am I doing wrong?

Eimantas
  • 48,927
  • 17
  • 132
  • 168
  • Make your constants static too; compiler issue I'm sure, but that seems to fix. For some reason compiler doesn't think that just `const` is really constant, but `const static` is. I'm sure there is some weird abstract reason in the docs somewhere – Albert Renshaw Jun 29 '18 at 18:26

2 Answers2

16

This can be solved through the use of an anonymous (though not necessarily so) enum type:

enum {
    kFirstScrollView = 0,
    kSecondScrollView = 1
};

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

This will compile without errors.

Aidan Steele
  • 10,999
  • 6
  • 38
  • 59
8

This is because case statement requires constant expression. Now in C and thus in Obj-C making a variable const does not create a true constant. Thus you are getting this error. But if you use C++ or Obj-C++ then this will work.

Some more hint is available here and here.

Community
  • 1
  • 1
taskinoor
  • 45,586
  • 12
  • 116
  • 142