无法访问#if指令中定义的struct变量

时间:2017-12-15 08:20:13

标签: ios swift struct environment preprocessor-directive

我已在我的项目中成功配置了3个不同的环境。我试图根据方案中设置的配置来加入基本URL。

如何访问名为' BASE_URL'的变量?来自下面的代码,如

  

AppConstants.API.BASE_URL

class AppConstants
{
    struct API
    {
        #if ENV_DEV
        static let BASE_URL = "http://api_dev .../"
        #endif

        #if ENV_STAGE
        static let BASE_URL = "http://api_stag .../"
        #endif

        #if ENV_PROD
        static let BASE_URL = "https://api_prod .../"
        #endif
    }
}

我知道这可以完成,因为我可以在其他项目中以这种方式访问​​:

更新:

  • 来自其他项目:

enter image description here

enter image description here

更新2:

我已在活动的编辑条件中将环境变量设置为:

enter image description here

我想我错过了一些东西,可能是在构建环境中。

2 个答案:

答案 0 :(得分:1)

刚刚测试了以下代码,它应该可以工作。您基本上需要将其从所有#if转换为使用#elseif#else。这是因为如果没有一个陈述是真的,BASE_URL可能会存在。{/ p>

您还可以设置默认值并在每个if语句中进行更改。但不知何故,如果if语句都不成立,你需要定义变量。

class AppConstants
{
    struct API
    {
        #if ENV_DEV
        static let BASE_URL = "http://api_dev .../"
        #elseif ENV_STAGE
        static let BASE_URL = "http://api_stag .../"
        #else
        static let BASE_URL = "https://api_prod .../"
        #endif
    }
}

print(AppConstants.API.BASE_URL)

请记住,如果if语句不为true,此解决方案将默认为最后一个基本URL。在原始问题中没有默认值。如果此行为可接受,则取决于您的配置。

答案 1 :(得分:0)

为了保护自己不设置正确的编译标志,你可以使用类似的东西:

class AppConstants
{
    struct API
    {
        static let BASE_URL: URL = { () -> URL in // URL should be URL
            let baseURLString: String

            #if ENV_DEV
                baseURLString = "http://api_dev .../"
            #endif

            #if ENV_STAGE
                baseURLString = "http://api_stag .../"
            #endif

            #if ENV_PROD
                baseURLString = "https://api_prod .../"
            #endif

            return URL(string: baseURLString)! // If no proper flag is set, you will get error here
        }()
    }
}

这里,如果没有设置任何标志,你将收到错误。

如果您设置多个标记,就像原始代码一样,它会不断出现错误。