Ios 无法访问在#if指令中定义的结构变量
我已经在我的项目中成功配置了3个不同的环境。我正在尝试根据scheme中设置的配置访问基本URL 如何从下面的代码访问名为“BASE_URL”的变量 AppConstants.API.BASE\u URL 我知道这是可以做到的,因为在其他项目中,我可以像这样访问: 更新: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。这是
- 来自其他项目:
我想我遗漏了一些东西,可能是在构建设置中。刚刚测试了以下代码,应该可以正常工作。您基本上需要将它从所有
#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(上面的我的解决方案)吗?或者您希望它抛出错误(更正拼写错误后的代码)?无论哪种方法在技术上都有效。但这取决于你想要什么,以及你想要如何处理那些程序员的错误和边缘案例。