Objective-C 中的常数

我正在开发Cocoa应用程序,并且使用常量NSString作为存储偏好设置键名的方法。

我知道这是个好主意,因为如果需要,它可以轻松更改键。另外,这就是整个 “将数据与逻辑分离” 的概念。

无论如何,有没有一种好的方法可以使整个应用程序一次定义这些常量?我敢肯定有一种简单而智能的方法,但是现在我的课程只是重新定义了他们使用的课程。

答案

// Constants.h
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.
// Constants.m
NSString *const MyFirstConstant = @"FirstConstant";
NSString *const MySecondConstant = @"SecondConstant";
// 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";
// In your *.m file
static NSString * const kNSStringConst = @"const value";
#ifdef __OBJC__
  #import <UIKit/UIKit.h>
  #import <Foundation/Foundation.h>
  #import "Constants.h"
#endif
// file.h
extern NSString* const MyConst;

//file.m
NSString* const MyConst = @"Lorem ipsum";
// 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
// myfile.h
#import <StringConsts.h>

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

// myfile.m
#define SYNTHESIZE_CONSTS
#import "myfile.h"
extern NSString * const PPRememberMusicList;
extern NSString * const PPLoadMusicAtListLoad;
extern NSString * const PPAfterPlayingMusic;
extern NSString * const PPGotoStartupAfterPlaying;
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";
// Constants.h
#define STR_CONST(name, value) extern NSString* const name
#include "ConstantList.h"
// Constants.m
#ifdef STR_CONST
    #undef STR_CONST
#endif
#define STR_CONST(name, value) NSString* const name = @ value
#include "ConstantList.h"
// ConstantList.h
STR_CONST(kMyConstant, "Value");
…
// Prefs.h
extern NSString * const RAHUL;

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

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

如果您想要全局常量之类的东西;一种快速的肮脏方法是将常量声明放入pch文件中。