Cocoa touch 目标C开关语句和命名整数常量

Cocoa touch 目标C开关语句和命名整数常量,cocoa-touch,uiscrollview,switch-statement,uiscrollviewdelegate,Cocoa Touch,Uiscrollview,Switch Statement,Uiscrollviewdelegate,我有一个控制器,它作为两个ScrollView的委托,这两个ScrollView放置在由前面提到的视图控制器管理的视图中 为了区分两个滚动视图,我尝试使用switch语句(而不是使用if语句进行简单的指针比较)。我将两个滚动视图标记为0和1,如下所示 NSUInteger const kFirstScrollView = 0; NSUInteger const kSecondScrollView = 1; 当我试图在switch语句中使用这些常量时,编译器会说case语句不是常量 switch

我有一个控制器,它作为两个ScrollView的委托,这两个ScrollView放置在由前面提到的视图控制器管理的视图中

为了区分两个滚动视图,我尝试使用
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
    }
}

我做错了什么?

这可以通过使用匿名(尽管不一定如此)
enum
类型来解决:

enum {
    kFirstScrollView = 0,
    kSecondScrollView = 1
};

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

这将无错误地编译。

这是因为case语句需要常量表达式。现在在C中,因此在Obj-C中,使一个变量常量不会产生一个真正的常量。因此,您得到了这个错误。但是如果你使用C++或Obj-C++,那么这将起作用。p>
还有一些提示可用。

这是一个可行的解决方案,也是我使用的,但我不明白为什么常量不起作用。那么,我们如何在Objective-C中创建常量呢#定义MY_常量123是一种方法,但这是唯一的方法吗?定义和枚举。它们都可以在C/Obj-C中创建真正的常量。也可以使您的常量保持静态;我敢肯定编译器的问题,但这似乎解决了。出于某种原因,编译器并不认为仅仅
const
是常数,而是
const static
是常数。我肯定在文件里有一些奇怪的抽象原因