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

Ana*_*and 11 objective-c ios

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

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

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

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

BOOL shouldRemind = [[NSUserDefaults standardUserDefaults] boolForKey:@"ReminderSwitch"];
Run Code Online (Sandbox Code Playgroud)

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

jus*_*tin 13

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

SomeFile.h

extern NSString *const MONConstantString;
Run Code Online (Sandbox Code Playgroud)

SomeFile.m

NSString *const MONConstantString = @"MONConstantString";
Run Code Online (Sandbox Code Playgroud)

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


然后,您将希望将常量放在与其相关的接口附近.以您的示例为主角,您可能需要一组用于应用程序首选项的界面或声明.在这种情况下,您可以将声明添加到MONAppsPreferences标头:

MONAppsPreferences.h

extern NSString *const MONApps_Pref_ReminderSwitch;
Run Code Online (Sandbox Code Playgroud)

MONAppsPreferences.m

NSString *const MONApps_Pref_ReminderSwitch = @"MONApps_Pref_ReminderSwitch";
Run Code Online (Sandbox Code Playgroud)

正在使用:

#import "MONAppsPreferences.h"
...
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:MONApps_Pref_ReminderSwitch];
Run Code Online (Sandbox Code Playgroud)


Fee*_*ics 9

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

Const.h

extern NSString *const UserIdPrefKey;
extern NSString *const PasswordPrefKey;
extern NSString *const HomepagePrefKey;
Run Code Online (Sandbox Code Playgroud)

Const.m

#import "AEConst.h"

NSString *const UserIdPrefKey = @"UserIdPrefKey";
NSString *const PasswordPrefKey = @"PasswordPrefKey";
NSString *const HomepagePrefKey = @"UrlHomepagePrefKey";
Run Code Online (Sandbox Code Playgroud)

只能导入Const.h.

当您编写代码时,Xcode支持编写密钥名称,以便您可以避免错误输入.


Eri*_*k S 5

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

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

你应该创建一个像头文件

// Constants.h 
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.
Run Code Online (Sandbox Code Playgroud)

您可以将此文件包含在使用常量的每个文件中,也可以包含在项目的预编译头文件中.

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

// Constants.m 
NSString *const MyFirstConstant = @"FirstConstant";
NSString *const MySecondConstant = @"SecondConstant"; 
Run Code Online (Sandbox Code Playgroud)

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

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

感谢Barry Wark :)


Art*_*hev 5

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

#define kUserDefaults @"ReminderSwitch"

  • 是的,不是那么安全,有一些其他目标c文件的机会覆盖,而不会被注意到:( (3认同)