我有一个名为 Constants.h 的文件:
extern NSString * const BASE_URL;
和 Constants.m :
#ifdef DEBUG
NSString * const BASE_URL = @"http://www.example.org ";
#else
NSString * const BASE_URL = @"http://localhost";
#endif
第一个问题:如何将DEBUG切换为True
和False
?
我有一个视图控制器文件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
[...]
代码不起作用并返回此错误:
error: Semantic Issue: Initializer element is not a compile-time constant
我该如何解决这个问题?
我需要将几个全局字符串变量与其他字符串组合以创建各种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/");
但最后一行 Parse error:expected')'出错。 可能我只能将CFSTR用于宏。我需要找到一种获取所有全局变量的方法。
答案 0 :(得分:6)
解决方案A:
就个人而言,我只会使用ANOTHER_URL
的函数。
解决方案B:
如果你真的想要一个常量:你应该能够通过#define
使用cstring连接规则,然后通过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/");
解决方案C:
如果你想通过初始化只创建一个,你也可以在C ++ / ObjC ++翻译中完成一个函数/方法本地静态(然后在需要时使用C或ObjC可见性):
NSString * URL() {
static NSString * const ANOTHER_URL = [NSString stringWithFormat:@"%@%@", BASE_URL, @"/path/"];
return ANOTHER_URL;
}
答案 1 :(得分:1)
首先,您可以告诉Xcode为调试版本设置一些预处理器宏。使用构建选项'预处理器宏'。
对于第二个问题,你不能调用objective-C方法来填充常量,因为这些东西在编译时是不可用的。您最好的选择是定义全局变量,然后在类'initialize'方法中为其赋值。
static NSString * ANOTHER_URL;
+ initialize {
ANOTHER_URL = [NSString stringWithFormat:@"%@%@", BASE_URL, @"/path/"];
}
在创建第一个类实例之前调用初始化,因此它是安全的。你必须删除const关键字,但我相信你可以相信自己! ;)
答案 2 :(得分:0)
#define DEBUG 1或0来禁用。
错误是因为您在编译常量时调用NSString方法。换句话说,你告诉编译器它无法处理的东西。您需要在启动时初始化这样的动态链接,编译器不能为您执行此操作。