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

可能重复:
目标C中的常量

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

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

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

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

首先,你应该去一个真正的外部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]; 

我想你的想法是对的。 例如,我制作了如下的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支持编写密钥名称,以便您可以避免错误输入。

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

#define kUserDefaults @"ReminderSwitch"

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

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

您应该创建一个头文件,如

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

感谢Barry Wark 🙂