Objective-C中的常量

7

我想为我的应用程序添加一些常量键,这些常量可以在程序的任何地方访问。因此,我在接口文件中声明了这些常量:

#import <UIKit/UIKit.h>
NSString * MIN_INTERVAL_KEY = @"MIN_INTERVAL_KEY";
NSString * MAX_TOBACCO_KEY = @"MAX_TOBACCO_KEY";
NSString * ICON_BADGE = @"ICON_BADGE";

@interface SmokingViewController : UIViewController {
}

我希望能够从MinIntervalViewController类中访问它们:

- (void)viewDidAppear:(BOOL)animated {
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    if (user) {
        self.selectedValue = [user objectForKey:MIN_INTERVAL_KEY];
    }
    [super viewDidAppear:animated];
}

但是应用程序在MinIntervalViewController类中显示错误:

错误:'MIN_INTERVAL_KEY'未声明(在此函数中首次使用)

我错过了什么吗?任何帮助将不胜感激。

谢谢


可能是 Objective C 中的常量 的重复问题。 - BadPirate
2个回答

19

常量.h

#import <Cocoa/Cocoa.h>

@interface Constants : NSObject {   

}

extern int const kExampleConstInt;
extern NSString * const kExampleConstString;

@end

Constants.m

#import "Constants.h"


@implementation Constants

int const kExampleConstInt = 1;
NSString * const kExampleConstString = @"String Value";

@end

使用方法:

#import "Constants.h"

然后,只需调用您希望使用的特定变量即可。

NSString *newString = [NSString stringWithString:kExampleConstString];

你的代码中以@或}开头的每一行都可以被删除,我的看法是 :-) 这里真的没有必要定义一个类。 - DarkDust
这可能是真的,但保留类语法可以使文件与应用程序中的每个其他头文件/实现对保持一致。各有所好。 - Philip Regan

2
在.h文件中:
extern NSString * const MIN_INTERVAL_KEY;

在一个.m文件中:

NSString * const MIN_INTERVAL_KEY = @"MIN_INTERVAL_KEY";

而你可能忽略了实际上需要导入声明MIN_INTERVAL_KEY的头文件;-) 因此,如果你在SmokingViewController.h中声明了它,但想在MinIntervalViewController.m中使用它,那么你需要在MinIntervalViewController.m导入"SmokingViewController.h"。由于Objective-C实际上更多地是C的扩展,因此所有C可见性规则都适用。

另外,帮助调试这种问题的方法是在Xcode中右键单击.m文件,然后选择“预处理”。然后你会看到文件被预处理,即CPP完成其工作之后。这就是C编译器真正消化的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接