2012-08-13 64 views
11

可能重复:
Constants in Objective C如何声明和使用NSString全局常量

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

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

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

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

如何以及在哪里可以声明一个全局的NSString常数,我可以在整个应用程序进行访问。然后,我将能够使用这个常量而不用担心忘记这些字符串键。

回答

5

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

this questionthis answer它,我已经引述如下:

您应该创建像

// Constants.h 
FOUNDATION_EXPORT NSString *const MyFirstConstant; 
FOUNDATION_EXPORT NSString *const MySecondConstant; 
//etc. 

一个头文件可以包含在使用的每个文件这个文件常量或在项目的预编译头文件中。

您定义的.m文件,这些常量像

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

Constants.m使得它在最终产品链接应该添加到您的应用程序/框架的目标。

使用代替#define'd常量 字符串常量的好处是,你可以使用指针比较 (stringInstance == MyFirstConstant)比字符串 比较([stringInstance isEqualToString:MyFirstConstant])(和 更易于阅读,IMO)快得多测试相等。

与感谢巴里·沃克:)

+0

他只需要应用程序中的常量(内部li nkage)所以我想知道你为什么建议他出口它们(外部链接)? – malhal 2016-07-31 22:36:07

9

。你的想法是对的,我想。例如,我提出Const.h /米文件象下面这样:

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

最简单的方法是制作简单的.h文件,像Utils。H和写有如下代码:

#define kUserDefaults @"ReminderSwitch"

+3

是啊,不太安全,有一个其他目标c文件覆盖的机会,而没有得到注意:( – thndrkiss 2015-02-25 23:16:10

13

首先,你应该去一个真正的外部C符号 - 不是宏。这是像这样做:

SomeFile.h

extern NSString *const MONConstantString; 

SomeFile.m

NSString *const MONConstantString = @"MONConstantString"; 

请注意,如果您使用ObjC和ObjC++的混合,则需要对C指定extern "C" ++ TU - 这就是为什么你会看到一个#define D导出,因语言而异。


然后,你会想把常量放在它所涉及的接口附近。以你的榜样为榜样,你可能需要一组接口或声明来表示你的应用的偏好。在这种情况下,你可能会在声明添加到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];