【问题标题】:Why can I not use my constant in the switch - case statement in Objective-C ? [error = Expression is not an integer constant expression]为什么我不能在 Objective-C 的 switch-case 语句中使用我的常量? [错误 = 表达式不是整数常量表达式]
【发布时间】:2011-07-05 15:36:10
【问题描述】:

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

我有 Constants.h 包含以下内容:

// Constants.h    
extern NSInteger const TXT_NAME;

Constants.m 为:

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

NSInteger const TXT_NAME        = 1;

然后在 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;
        }
    }
}

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: objective-c tags constants case switch-statement


    【解决方案1】:

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

    原因:如果在 .m 中设置常量的值,其他只包含 .h 文件的翻译单元看不到它。必须在编译时知道常量的值才能在 case 中使用 switch

    更新:

    在 Objective-C++ 中编译时,上述方法有效。您需要将文件以 .mm 而不是 .m 结尾,以便在 Objective-C++ 而不是 Objective-C 中编译它们。

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

    #define TXT_NAME 1

    或者更好,像这样:

    enum {TXT_NAME = 1};

    【讨论】:

    • 这个解决方案如果在多个实现文件中导入constants.h会导致链接器错误
    • @Vladimir,不,它不会导致链接器错误,因为默认情况下常量是静态链接的。
    • @Vladimir,这实际上仅在用 C++ 编译时才是正确的。对不起。
    • @Jules 因为if 语句中的== 测试不需要在编译时知道常量。 case: 需要一个编译时间常数值。
    • 对常量使用#define 是个糟糕的主意。常量的意义在于将文本视为符号,而不是字符。
    【解决方案2】:

    我通常会按照 Apple 的做法,像这样在 .h 文件中定义一个 typedef 枚举。

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

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

    - (void)myMethod:(PSOption)option;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 2022-10-08
      • 2011-11-15
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      相关资源
      最近更新 更多