为什么我不能在Objective-C的switch - case语句中使用常量?[error = Expression不



所以我有一个问题,在Objective-C中使用下面的开关语句中的常量变量。

我有Constants.h,下面是:

// Constants.h    
extern NSInteger const TXT_NAME;

常数。m :

// Constants.m
#import "Constants.h"
NSInteger const TXT_NAME        = 1;

然后在TabBasic中。m我正在尝试在切换大小写语句中使用这个常量:

// 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;
        }
    }
}

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

  • 表达式不是整数常量表达式
  • Case标签不减少为整数常数

有人知道我做错了什么吗?UITextField的"tag"变量返回一个NSInteger,所以我看不出有什么问题…

谢谢你的帮助!

快速解决方案,您应该将NSInteger const TXT_NAME = 1;放在Constants.h中,并且不需要在Constants.m中添加任何内容。

原因:如果你在。m中设置了常量的值,那么它对其他只包含。h文件的翻译单元是不可见的。该常量的值必须在编译时已知,以便能够在switch中的case中使用。

更新:

以上在objective - c++中编译时有效。你需要让你的文件以.mm而不是.m结尾,以便它们在objective - c++而不是Objective-C中编译。

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

#define TXT_NAME 1

或者更好,像这样:

enum {TXT_NAME = 1};

我通常会遵循Apple的做法,在.h文件中定义一个类型定义枚举,像这样。

typedef NS_ENUM(NSInteger, PSOption) {
  PSOption1,
  PSOption2,
  PSOption3,
  PSOption4,
};  

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

- (void)myMethod:(PSOption)option;

#define相比,这样做的另一个优点是代码完成和编译器检查

最新更新