11

可能重复:
Objective C 中的常量

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

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

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

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

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

4

4 回答 4

13

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

一些文件.h

extern NSString *const MONConstantString;

一些文件.m

NSString *const MONConstantString = @"MONConstantString";

请注意,如果您混合使用 ObjC 和 ObjC++,则需要指定extern "C"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];
于 2012-08-13T11:55:41.967 回答
9

我觉得你的想法是对的。例如,我制作了如下的 Const.h/m 文件:

常量.h

extern NSString *const UserIdPrefKey;
extern NSString *const PasswordPrefKey;
extern NSString *const HomepagePrefKey;

常数

#import "AEConst.h"

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

只有 Const.h 必须被导入。

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

于 2012-08-13T11:09:35.367 回答
5

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

请参阅我在下面引用的这个问题 及其答案:

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

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

感谢巴里·沃克 :)

于 2012-08-13T11:01:54.250 回答
4

最简单的方法是制作简单的 .h 文件,例如 Utils.h 并在其中编写以下代码:

#define kUserDefaults @"ReminderSwitch"

于 2012-08-13T11:14:53.733 回答