Ios 无法访问在#if指令中定义的结构变量

Ios 无法访问在#if指令中定义的结构变量,ios,swift,struct,environment,preprocessor-directive,Ios,Swift,Struct,Environment,Preprocessor Directive,我已经在我的项目中成功配置了3个不同的环境。我正在尝试根据scheme中设置的配置访问基本URL 如何从下面的代码访问名为“BASE_URL”的变量 AppConstants.API.BASE\u URL 我知道这是可以做到的,因为在其他项目中,我可以像这样访问: 更新: 来自其他项目: 更新2: 我已将活动组合条件下的环境变量设置为: 我想我遗漏了一些东西,可能是在构建设置中。刚刚测试了以下代码,应该可以正常工作。您基本上需要将它从所有#if转换为使用#elseif和#else。这是

我已经在我的项目中成功配置了3个不同的环境。我正在尝试根据scheme中设置的配置访问基本URL

如何从下面的代码访问名为“BASE_URL”的变量

AppConstants.API.BASE\u URL

我知道这是可以做到的,因为在其他项目中,我可以像这样访问:

更新:

  • 来自其他项目:

更新2:

我已将活动组合条件下的环境变量设置为:


我想我遗漏了一些东西,可能是在构建设置中。

刚刚测试了以下代码,应该可以正常工作。您基本上需要将它从所有
#if
转换为使用
#elseif
#else
。这是因为如果这些语句都不是真的,
BASE\u URL
可能不存在

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
语句中更改它。但不知何故,如果
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语句不正确,此解决方案将默认为最后一个基本url。在最初的问题中,没有违约。此行为是否可接受取决于您的配置。

为了防止自己未设置正确的编译标志,您可以使用以下方法:

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
        }()
    }
}
在这里,如果不设置任何标志,您将得到错误


如果您像原始代码一样设置了多个标志,则会不断引发错误。

为什么这需要是一个类?如何访问它,错误消息是什么?它是否编译?从编译器的角度来看,您的
BASE\uURL
声明并不是相互排斥的。如果检查通过并且多次声明了
BASE\u URL
,则没有任何东西(除了开发人员的注意)可以防止两个或全部三个
。@iAkki:生成设置中有一个输入错误:ENV\u STAG,代码中有一个输入错误:ENV\u STAG。除此之外,它应该像你做的那样工作。投票结束是因为离题(简单的印刷错误)。谢谢。这很有效。但为什么它不能通过onlt访问?如果,像更新问题中的屏幕截图所示的那样?我不知道为什么你的第一个更新屏幕截图有效。我认为你应该安全并设置默认值。正如user28434所说,除了开发人员的注意之外,没有任何东西可以防止它被多次声明。这通常是一件坏事,为问题打开了大门。防御性编码。在这里使用带有默认值的if-else语句并确保始终声明BASE_URL似乎是最好的方法。我不同意这种解决方案。如果每个配置都需要一个专用的基本URL,那么构建设置中缺少的定义就是一个编程错误,不应该编译,而不是静默地返回某个URL此外,它也没有解释为什么OP的代码不能编译。@MartinR如果您有更好的解决方案,请随意发布。虽然我同意你所说的,但如果不确保声明变量,我就无法访问该变量。不确定如何使用原始代码实现这一点。但是,如果您有更好的解决方案,请随时回答。每件事都有利弊。@iAkki这取决于你想要什么。如果你的代码中有问题,比如你的拼写错误。您想让它使用默认的基本url(上面的我的解决方案)吗?或者您希望它抛出错误(更正拼写错误后的代码)?无论哪种方法在技术上都有效。但这取决于你想要什么,以及你想要如何处理那些程序员的错误和边缘案例。