为什么我不能在Objective-C中的switch-case语句中使用我的常量?[error = Expression不是整数常量表达式]

Jul*_*les 14 tags constants case objective-c switch-statement

所以我在Objective-C的以下switch语句中使用常量变量时​​遇到问题.

我有以下Constants.h:

// Constants.h    
extern NSInteger const TXT_NAME;
Run Code Online (Sandbox Code Playgroud)

Constants.m为:

// Constants.m
#import "Constants.h"

NSInteger const TXT_NAME        = 1;
Run Code Online (Sandbox Code Playgroud)

然后在TabBasic.m中我试图在switch-case语句中使用这个常量:

// TabBasic.m

#import "TabBasic.h"
#import "Constants.h"

... code ...

- (IBAction)saveValue:(id)sender {
    if ([sender isKindOfClass: [UITextField class]]) {
        UITextField *txtField = (UITextField *) sender;

        switch (txtField.tag) {
            case TXT_NAME:
                NSLog(@"Set property name to: %@", txtField.text); 
                break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它在"案例TXT_NAME:"行中给了我以下两个错误:

  • 表达式不是整数常量表达式
  • 案例标签不会减少为整数常量

有谁知道我做错了什么?UITextField的"tag"变量返回一个NSInteger,所以我没有看到问题......

谢谢你的帮助!

Tho*_*mas 20

快速解决方案,你应该放在NSInteger const TXT_NAME = 1;Constants.h中,并且在Constants.m中不需要任何东西.

原因:如果在.m中设置常量的值,则仅包含.h文件的其他翻译单元不会显示该值.必须在编译时知道常量的值才能在a case中使用switch.

更新:

在Objective-C++中编译时,上述工作.您需要将文件结束,.mm而不是.m使用Objective-C++而不是Objective-C编译它们.

为了在Objective-C中工作,你应该像这样定义你的常量:

#define TXT_NAME 1

甚至更好,像这样:

enum {TXT_NAME = 1};

  • 如果将constants.h导入到多个实现文件中,此解决方案将导致链接器错误 (4认同)
  • @Vladimir,实际上只有在用C++编译时才是真的.抱歉. (3认同)
  • 使用#define作为常量是一个糟糕的主意.常量的要点是将文本视为符号,而不是字符. (3认同)

Pau*_*l.s 10

我通常会遵循Apple的样子,并在.h文件中定义一个typedef枚举.

typedef NS_ENUM(NSInteger, PSOption) {
  PSOption1,
  PSOption2,
  PSOption3,
  PSOption4,
};  
Run Code Online (Sandbox Code Playgroud)

然后,您可以在case语句中使用它,甚至将它传递给函数以及类型,例如

- (void)myMethod:(PSOption)option;
Run Code Online (Sandbox Code Playgroud)

在a上执行此操作的另一个优点#define是代码完成和编译器检查