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

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

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

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


当前回答

你应该创建一个像这样的头文件:

// Constants.h
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.

(如果您的代码不会在混合C/ c++环境或其他平台上使用,则可以使用extern而不是FOUNDATION_EXPORT。)

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

在.m文件中定义这些常量:

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

常量。应该将M添加到应用程序/框架的目标中,以便将其链接到最终产品中。

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

其他回答

尝试使用类方法:

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

我有时会用。

如果你想要全局常数;一种快速但肮脏的方法是将常量声明放入PCH文件中。

我自己有一个头专门声明常量nsstring用于首选项,如下所示:

extern NSString * const PPRememberMusicList;
extern NSString * const PPLoadMusicAtListLoad;
extern NSString * const PPAfterPlayingMusic;
extern NSString * const PPGotoStartupAfterPlaying;

然后在附带的.m文件中声明它们:

NSString * const PPRememberMusicList = @"Remember Music List";
NSString * const PPLoadMusicAtListLoad = @"Load music when loading list";
NSString * const PPAfterPlayingMusic = @"After playing music";
NSString * const PPGotoStartupAfterPlaying = @"Go to startup pos. after playing";

这种方法对我很有帮助。

编辑:注意,如果字符串在多个文件中使用,则效果最好。如果只有一个文件使用它,你可以在使用字符串的。m文件中做#define kNSStringConstant @“常量NSString”。

// Prefs.h
extern NSString * const RAHUL;

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

正如Abizer所说,您可以将其放入PCH文件中。另一种不那么脏的方法是为所有键创建一个包含文件,然后将其包含在您使用键的文件中,或者将其包含在PCH中。在它们自己的包含文件中,至少给了您一个查找和定义所有这些常量的地方。