研究员......
Constants.h
extern NSString * const LOGIN_URL;
Constants.m
NSString * const LOGIN_URL = @“http://www.url.com”;
无论如何,我可以将下面的伪代码复制到Objective C中吗?
if([[[[NSBundle mainBundle] infoDictionary] objectForKey:@"DebugMode"] boolValue] == NO)
{
NSString * const LOGIN_URL = @"http://www.production-url.com";
}
else
{
NSString * const LOGIN_URL = @"http://www.qa-url.com";
}
答案 0 :(得分:4)
你的要求是不可能的(至少不是你要求的方式)。在编译时设置并建立常量(不严格为真,但为了这个解释,它会这样做),因此意味着它不能在运行时因任何原因而变异。
根据调试和释放代码更改常量值的传统方法是通过预处理器。像这样:
#if __DEBUG_MODE__ == 1
NSString * const LOGIN_URL = @"http://www.qa-url.com";
#else
NSString * const LOGIN_URL = @"http://www.production-url.com";
#endif
现在需要先定义__DEBUG_MODE__
才能执行任何操作,并且有几种方法可以做到这一点。您可以将以下行添加到前缀头文件(.pch)
#define __DEBUG_MODE__ 1 // Change to 0 to disable debug mode.
或将编译器标志-M__DEBUG_MODE__=1
添加到您希望生效的文件中。这意味着只要__DEBUG_MODE__
设置值为1,编译器就会使用调试常量,当值为0时,编译器将使用生成常量。
这样做的好处是可以将调试和生产代码分开(你应该避免在二进制文件中同时使用它们,因为它可以打开整个问题和安全问题)。
希望这有帮助。
答案 1 :(得分:1)
每当我遇到这样的情况时,我就在我的常量文件中创建了一个类方法:
+ (NSString *)loginURL {
if([[[[NSBundle mainBundle] infoDictionary] objectForKey:@"DebugMode"] boolValue] == NO){
return @"http://www.production-url.com";
}
else {
return @"http://www.qa-url.com";
}
}
它还使您的代码更清晰,因为loginURL
字符串是通过方法传递的,它可能取决于运行时条件:
NSURL *loginURL = [NSURL URLWithString:[Constants loginURL]];