如何声明和使用NSString全局常量

12

可能重复问题:
Objective C中的常量

我将一些应用程序设置存储在NSUserDefaults中,使用NSString作为键。问题是我需要使用这些NSString键在整个应用程序中访问这些设置。有可能在应用程序的某个部分访问时,我会错误地输入此类字符串键。

在整个应用程序中,我有这样的语句

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

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

我该如何在整个应用程序中声明一个全局NSString常量,并且可以随时访问它。这样我就可以在使用该常量时不必担心键入错误的字符串键。

4个回答

14

首先,您应该选择一个真正的extern C符号,而不是一个宏。可以像这样完成:

SomeFile.h

extern NSString *const MONConstantString;

SomeFile.m

NSString *const MONConstantString = @"MONConstantString";

注意,如果您同时使用Objective-C和Objective-C++,则需要为C++ TUs指定extern "C"。这就是为什么您会看到根据语言不同而变化的#defined导出的原因。


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

MONAppsPreferences.h

extern NSString *const MONApps_Pref_ReminderSwitch;

MONAppsPreferences.m

NSString *const MONApps_Pref_ReminderSwitch = @"MONApps_Pref_ReminderSwitch";

使用中:

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

9
您的想法是正确的。例如,我创建了以下Const.h/m文件:
Const.h:
extern NSString *const UserIdPrefKey;
extern NSString *const PasswordPrefKey;
extern NSString *const HomepagePrefKey;

Const.m

#import "AEConst.h"

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

只需导入Const.h文件。

在编写代码时,Xcode支持键名输入,以避免输入错误。


5
你似乎正在寻找一种在应用程序中定义字符串常量的方法。
请参见此问题和我引用的答案,以下是引用内容:

You should create a header file like

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

// 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).

感谢Barry Wark的贡献 :)


他只想要应用程序中的常量(内部链接),所以我想知道为什么你建议他将它们导出(外部链接)? - malhal

4
最简单的方法是创建一个类似于 Utils.h 的简单头文件,并在其中编写以下代码: #define kUserDefaults @"ReminderSwitch"
该代码片段定义了一个名为 kUserDefaults 的常量,其值为 "ReminderSwitch"。

3
是的,不太安全,有可能会有其他的Objective-C文件在不被注意的情况下覆盖它。 - thndrkiss

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