关于objective c:如何声明和使用NSString全局常量

How to declare and use NSString global constants

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Constants in Objective C

我在nsuserdefaults中存储一些应用程序设置。nsstrings用作键。问题是我需要使用这些nsstring键在整个应用程序中访问这些设置。在应用程序的某些部分中访问时,有可能输入错误的字符串键。

在整个应用程序中,我都有这样的声明

1
2
3
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ReminderSwitch"];

BOOL shouldRemind = [[NSUserDefaults standardUserDefaults] boolForKey:@"ReminderSwitch"];

如何在何处声明全局nsstring常量,我可以在整个应用程序中访问该常量。然后我就可以使用这个常量,而不用担心输入错误。


首先,您应该使用真正的外部C符号,而不是宏。这样做:

一些文件.h

1
extern NSString *const MONConstantString;

一些文件.m

1
NSString *const MONConstantString = @"MONConstantString";

请注意,如果使用Objc和Objc++的混合,您将需要为C++ TUS指定EDCOX1 OR 1,这就是为什么您会看到一个EDCOX1×2×D导出,它不同于语言。

然后,您将希望将常量放在它相关的接口附近。以您的示例为例,您可能需要一组接口或声明作为应用程序的首选项。在这种情况下,您可以将声明添加到MONAppsPreferences头:

蒙纳普斯参考文献.h

1
extern NSString *const MONApps_Pref_ReminderSwitch;

蒙纳普斯参考文献.m

1
NSString *const MONApps_Pref_ReminderSwitch = @"MONApps_Pref_ReminderSwitch";

使用中:

1
2
3
#import"MONAppsPreferences.h"
...
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:MONApps_Pref_ReminderSwitch];


我认为你的想法是对的。例如,我创建了如下const.h/m文件:

常量H

1
2
3
extern NSString *const UserIdPrefKey;
extern NSString *const PasswordPrefKey;
extern NSString *const HomepagePrefKey;

常量m

1
2
3
4
5
#import"AEConst.h"

NSString *const UserIdPrefKey = @"UserIdPrefKey";
NSString *const PasswordPrefKey = @"PasswordPrefKey";
NSString *const HomepagePrefKey = @"UrlHomepagePrefKey";

只能导入常量h。

当您编写代码时,Xcode支持编写密钥名,这样您就可以避免错过输入。


最简单的方法是创建简单的.h文件,如utils.h,并在其中编写以下代码:

#define kUserDefaults @"ReminderSwitch"


您似乎在寻找的只是一种在应用程序中定义字符串常量的方法。

看到这个问题我在下面引用了这个答案:

You should create a header file like

1
2
3
4
// Constants.h
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.

You can include this file in each file that uses the constants or in the pre-compiled header > for the project.

You define these constants in a .m file like

1
2
3
// Constants.m
NSString *const MyFirstConstant = @"FirstConstant";
NSString *const MySecondConstant = @"SecondConstant";

Constants.m should be added to your application/framework's target so that it is linked in to the final product.

The advantage of using string constants instead of #define'd constants
is that you can test for equality using pointer comparison
(stringInstance == MyFirstConstant) which is much faster than string
comparison ([stringInstance isEqualToString:MyFirstConstant]) (and
easier to read, IMO).

感谢巴里·沃克:)