iOS常量文件中的条件IF / ELSE语句

时间:2013-02-08 16:33:19

标签: ios objective-c cocoa constants

研究员......

  • 我在应用程序的全局常量文件中设置了服务器URL。
  • 我的应用程序plist中还有一个名为“DebugMode”的变量,一旦切换,应该更改应用程序将使用的URL。

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";
}

2 个答案:

答案 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]];