Objective-C中的全局常量

Fre*_*ins 8 iphone global-variables objective-c ios5

我有一个名为Constants.h的文件:

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

Constants.m:

#ifdef DEBUG
    NSString * const BASE_URL = @"http://www.example.org ";
#else
    NSString * const BASE_URL = @"http://localhost";
#endif
Run Code Online (Sandbox Code Playgroud)

第一个问题:我如何切换DEBUG是TrueFalse


我有一个视图控制器文件MyViewController.m:

#import "MyViewController.h"
#import "Constants.h"

// this doesn't works. see above for the error.
static NSString * const ANOTHER_URL = [NSString stringWithFormat:@"%@%@", BASE_URL, @"/path/"];

@implementation HomeViewController

[...]
Run Code Online (Sandbox Code Playgroud)

代码不起作用并返回此错误:

error: Semantic Issue: Initializer element is not a compile-time constant
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

我需要将几个全局字符串变量与其他字符串组合以创建各种URL.


更新1

现在Constants.m是:

#import "Constants.h"

#ifdef DEBUG
    #define DEF_BASE_URL "http://www.example.org/"
#else
    #define DEF_BASE_URL "http://localhost/"
#endif

NSString * const BASE_URL = (NSString*)CFSTR(DEF_BASE_URL);
NSString * const API_URL = (NSString*)CFSTR(DEF_BASE_URL "api/");
NSString * const API_SETTINGS_URL = (NSString*)CFSTR(API_URL "settings/");
Run Code Online (Sandbox Code Playgroud)

但是最后一行Parse错误有一个错误:expect')'.可能我只能将CFSTR用于宏.我需要找到一种拥有所有全局变量的方法.

jus*_*tin 6

解决方案A:

就个人而言,我只会使用一个函数ANOTHER_URL.

解决方案B:

如果你真的想要一个常量:你应该能够使用cstring连接规则#define,然后管道通过CFSTR():

// defs.h
extern NSString * const BASE_URL;
extern NSString * const ANOTHER_URL;

// defs.m

#ifdef DEBUG
#define DEF_BASE_URL "http://www.example.org"
#else
#define DEF_BASE_URL "http://localhost"
#endif

NSString * const BASE_URL = (NSString*)CFSTR(DEF_BASE_URL);
NSString * const ANOTHER_URL = (NSString*)CFSTR(DEF_BASE_URL "/path/");
Run Code Online (Sandbox Code Playgroud)

解决方案C:

如果你想通过初始化只创建一个,你也可以在C++/ObjC++翻译中完成一个函数/方法本地静态(然后在需要时使用C或ObjC可见性):

NSString * URL() {
  static NSString * const ANOTHER_URL = [NSString stringWithFormat:@"%@%@", BASE_URL, @"/path/"];
  return ANOTHER_URL;
}
Run Code Online (Sandbox Code Playgroud)