我正在开发一个Cocoa应用程序,我使用常量nsstring作为存储我的首选项的键名的方式。

我知道这是一个好主意,因为它允许在必要时轻松更改密钥。 此外,这是整个“将数据与逻辑分离”的概念。

不管怎样,有没有一种好方法让这些常量在整个应用程序中定义一次?

我相信有一种简单而聪明的方法,但现在我的类只是重新定义它们所使用的方法。


当前回答

// Prefs.h
extern NSString * const RAHUL;

// Prefs.m
NSString * const RAHUL = @"rahul";

其他回答

我通常使用Barry Wark和Rahul Gupta发布的方法。

虽然,我不喜欢在.h和.m文件中重复相同的单词。 注意,在下面的例子中,这一行在两个文件中几乎是相同的:

// file.h
extern NSString* const MyConst;

//file.m
NSString* const MyConst = @"Lorem ipsum";

因此,我喜欢使用一些C预处理器机制。 让我通过例子来解释。

我有一个头文件,它定义宏STR_CONST(名称,值):

// StringConsts.h
#ifdef SYNTHESIZE_CONSTS
# define STR_CONST(name, value) NSString* const name = @ value
#else
# define STR_CONST(name, value) extern NSString* const name
#endif

h/里的。m对,我想定义常数,我这样做:

// myfile.h
#import <StringConsts.h>

STR_CONST(MyConst, "Lorem Ipsum");
STR_CONST(MyOtherConst, "Hello world");

// myfile.m
#define SYNTHESIZE_CONSTS
#import "myfile.h"

等,瞧,我有关于常数的所有信息在.h文件只有。

// Prefs.h
extern NSString * const RAHUL;

// Prefs.m
NSString * const RAHUL = @"rahul";

尝试使用类方法:

+(NSString*)theMainTitle
{
    return @"Hello World";
}

我有时会用。

还有一件事要提一下。如果你需要一个非全局常量,你应该使用static关键字。

例子

// In your *.m file
static NSString * const kNSStringConst = @"const value";

因为static关键字,这个const在文件外部是不可见的。


@QuinnTaylor的小修正:静态变量在编译单元中是可见的。通常,这是一个单独的.m文件(如本例所示),但是如果你在包含在其他地方的头文件中声明它,它会咬你一口,因为编译后你会得到链接器错误

简单的方法:

// Prefs.h
#define PREFS_MY_CONSTANT @"prefs_my_constant"

更好的办法:

// Prefs.h
extern NSString * const PREFS_MY_CONSTANT;

// Prefs.m
NSString * const PREFS_MY_CONSTANT = @"prefs_my_constant";

第二种方法的一个好处是,改变常量的值不会导致整个程序的重新构建。