哪里是在iOS应用程序中存储常量的最佳位置?
我正在开发一个应用程序,从JSON API获取资源。
所有资源都具有相同的基本url:
http://api.mysite.com/resources.json http://api.mysite.com/other_resources.json
我想存储http://api.mysite.com/
string,以便它可以用于我的所有控制器和模型,在编写资源URL时删除一些重复项。
最好的地方在哪里呢? -prefix.pch文件?
任何意见赞赏
我同意Alex Coplan的回答,并附上一个重要的补充。
把所有的常量放在一个名为“Constants.h”的文件(或者你想要的)
编辑:
- 三年前,当我回答这个问题的时候,我就在
#define
潮stream中,请看下面的修改。
Constants.h
#define kFilterDate @"date" #define kFilterRadius @"radius" #define kFilterSort @"sort" //Global Strings #define kDividingString @" / " //Strings #define kTour @"Tour" #define kToursKey @"tours"
但不是将其导入到任何需要的文件中,而是将其导入到您的前缀文件中,以便您的所有头文件在整个项目中自动导入。
Project_Prefix.pch
// // Prefix header for all source files of the project // #ifdef __OBJC__ #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import "Constants.h" #endif
修订
虽然所有以前的信息仍然可以工作,但是我们可以做一些事情,使我们的常量更安全一些。
使用constvariables在Constants.h
文件中创build常量
//Filters FOUNDATION_EXPORT NSString *const kFilterDate; FOUNDATION_EXPORT NSString *const kFilterRadius; FOUNDATION_EXPORT NSString *const kFilterSort; //Global Strings FOUNDATION_EXPORT NSString *const kDividingString; //Strings FOUNDATION_EXPORT NSString *const kTour; FOUNDATION_EXPORT NSString *const kToursKey;
而在Constants.m
//Filters NSString *const kFilterDate = @"date"; NSString *const kFilterRadius = @"radius"; NSString *const kFilterSort = @"sort"; //Global Strings NSString *const kDividingString = @" / "; //Strings NSString *const kTour = @"Tour"; NSString *const kToursKey = @"tours";
这仍然可以像上面那样导入到你的前缀文件中,但是只能使用文件中真正全局的常量来做到这一点。 在许多地方经常使用的东西。 将所有的常量转储到这个文件中将会使你使用任何常量的代码被耦合到常量文件中。 因此,如果您尝试重新使用代码,常量文件必须与它一起。 这并不总是一定是坏的,许多时候是有意的(这很好),但是限制依赖总是一个好主意。
关于修订的一些事情:
-
FOUNDATION_EXPORT
vsextern
。 第一个针对C和C ++编译的不同。 它基本上意味着extern
,但在C ++中将添加“C”标志。 -
consts
vsdefines
。consts
是types安全和尊重范围。defines
是完全相反的。
我个人更喜欢使用实际的constvariables而不是定义。
在MyConstants.m文件中我有:
NSString *const kXYMySiteBaseURL = @"http://api.mysite.com/"; NSString *const kXYSomeOtherURL = @"http://www.google.com/";
其中XY是我的姓名缩写或其他“唯一”前缀,以避免与其他常量的冲突。
然后我有这样一个MyConstants.h文件:
extern NSString *const kXYMySitBaseURL; extern NSString *const kXYSomeOtherURL;
根据有多less文件需要访问这些常量,我可能会把它包含在像ColdFusion在他的答案中所build议的预编译头文件中。
这就是苹果如何在大多数Core框架中定义它们的常量。
我只是创build一个名为Globals.h
的文件,如下所示:
#define kBaseURL @"http://api.mysite.com/"
然后使用:
#import "Globals.h" // at the top NSString *url = [NSString stringWithFormat:@"%@resources.json",kBaseURL];
我会创build一个单身人士或使用AppDelegate并把常量在那里。
是的,一个全球性的头文件将是理想的解决scheme。 除非计划将其用于pipe理数据存储等其他事情,否则我不会采用单例模式。 全局单例是有点矫枉过正的。