Objective c 整数常量不存在';不减少到整数';

Objective c 整数常量不存在';不减少到整数';,objective-c,Objective C,我用这个代码来设置我的常数 // Constants.h extern NSInteger const KNameIndex; // Constants.m NSInteger const KNameIndex = 0; 在导入Constant.h文件的文件中的switch语句中,我有以下内容: switch (self.sectionFromParentTable) { case KNameIndex: self.types = self.facilityTypes

我用这个代码来设置我的常数

// Constants.h
extern NSInteger const KNameIndex;

// Constants.m
NSInteger const KNameIndex = 0;
在导入Constant.h文件的文件中的switch语句中,我有以下内容:

switch (self.sectionFromParentTable) {
    case KNameIndex:
        self.types = self.facilityTypes;
        break;
    ...
我在编译时遇到了这样一个错误:“错误:case-label没有减少到整数常量”


你知道什么可能会弄糟吗?

我想你必须使用
const int
而不是
const NSInteger
,因为开关只适用于内置的整数类型。(不确定您的语法,在类型后循环使用const)


看看相关的问题:

这是一个暗箭伤人的问题,因为我很久没有使用Cocoa/ObjC了,但是成员变量sectionFromParentTable不是int类型吗?

对于C/C++和Objective-C,case语句在编译时必须有固定的值—“缩减为整数(读取值)”

你的常数不是一个真正的“常数”,因为它是一个变量,我想它可以通过一个指针来改变-例如
&KNameIndex

通常将常量定义为
enum

enum {
    KNameIndex = 0,
    kAnotherConstant = 42
};

如果您使用C++或ObjuleC++(以.mm作为文件扩展名),可以使用const语句作为

const int KNameIndex = 0;

我没有使用过Objective C,但我会尝试放弃“extern”。如果这是C++,则<>代码>常数> m >代码>文件将不是<代码> > m > />代码>的编译单元的一部分,因此编译器的未知代码<代码> KNMAX索引>代码>的值将是未知的。这可以解释错误;不可知值不能是常数

将定义而不仅仅是声明放在
Constants.h
文件中是否有帮助?

您可以使用

#define KNameIndex 0

...

switch (self.sectionFromParentTable) {
        case KNameIndex:
                self.types = self.facilityTypes;
                break;
        ...
它应该会起作用


只是遇到了同样的问题,我决定使用#define而不是enum。为我工作™ ;-)

请注意,NSInteger被定义为int[typedef int NSInteger;]可能您想到的是NSNumber?啊,您是对的。我离熟练掌握Objective-C还有很长的路要走。const语句在Objective-C中是完全合法的,在NSInteger中也是完全可操作的。我在这里用minimal.m文件和gcc进行了测试,我得到了相同的“case label不会减少到整数常量”的“const int kAA=0”;常量(即使使用g++)
const int kTest=0;int main(){int a=1;开关(a){case-kTest:break;}
编译为.m给出了>>函数'main'中的test1.m:test1.m:8:错误:case-label未减少为整数常量