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

时间:2012-08-13 10:59:11

标签: objective-c ios

  

可能重复:
  Constants in Objective C

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

在整个应用程序中,我都有这样的陈述

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

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

我如何以及在何处声明我可以在整个应用程序中访问的全局NSString常量。然后,我将能够使用该常量,而不必担心错误键入这些字符串键。

4 个答案:

答案 0 :(得分:13)

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

SomeFile.h

extern NSString *const MONConstantString;

SomeFile.m

NSString *const MONConstantString = @"MONConstantString";

请注意,如果您混合使用ObjC和ObjC ++,则需要为C ++ TU指定extern "C" - 这就是为什么您会看到#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];

答案 1 :(得分: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支持编写密钥名称,以避免错误输入。

答案 2 :(得分:5)

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

参见this questionthis answer它,我在下面引用过:

  

您应该创建一个像

这样的头文件
// Constants.h 
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.
     

您可以在使用常量的每个文件中或在预编译的头文件中包含此文件&gt;为该项目。

     

您可以在.m文件中定义这些常量,例如

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

应将Constants.m添加到您的应用程序/框架的目标中,以便将其链接到最终产品。

     

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

感谢Barry Wark:)

答案 3 :(得分:5)

最简单的方法是制作简单的.h文件,就像Utils.h一样,写下以下代码:

#define kUserDefaults @"ReminderSwitch"