【问题标题】:Conditional IF/ELSE statements in iOS Constants FileiOS 常量文件中的条件 IF/ELSE 语句
【发布时间】:2013-02-08 16:33:18
【问题描述】:

各位程序员...

  • 我在应用程序的全局常量文件中设置了服务器 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";
}

【问题讨论】:

    标签: ios objective-c cocoa constants


    【解决方案1】:

    您的要求并不完全可能(至少不是您要求的方式)。一个常量在编译时被设置和建立(不是严格正确的,但为了这个解释,它会这样做),因此意味着它不能在运行时以任何理由被改变。

    根据调试和发布代码更改常量值的传统方法是通过预处理器。像这样:

    #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 时,编译器将使用生产常量。

    这还具有将调试代码和生产代码分开的好处(您应该避免将两者都放在二进制文件中,因为它可能会引发整个世界的问题和安全问题)。

    希望这会有所帮助。

    【讨论】:

    • Tom,所以我无法在我实际设置常量的 Constants.m 文件中设置条件?意思是,我不是在设置常量之后尝试更改常量,而是尝试在常量设置之前执行条件。
    • 正如我所说,不是直接的。问题来自 if 关键字/构造是需要当前堆栈帧的实际可执行代码,而全局常量的想法是它存在于堆栈帧之外,并且存在于应用程序常量数据存储中。这就是为什么这种事情在编译时通过预处理器完成的原因。我强烈建议阅读有关预处理器及其用途和用途的信息。如果使用得当,它可以成为一个非常强大的工具。
    【解决方案2】:

    每当我遇到这种情况时,我都会在我的常量文件中创建一个类方法:

    + (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]];
    

    【讨论】:

    • 谢谢 Chris,我有这个想法,但我将所有内容都放在一个常量文件中以便更好地组织,并希望我可以在实际常量文件中实现相同的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-09-06
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多