什么是传统的c-style #error
关键字的迅速替换?
当预定义失败时,我需要它来引发编译时错误:
#if CONFIG1
...
#elseif CONFIG2
...
#else
#error "CONFIG not defined"
#endif
根据documentation,没有特定的#error宏。但是程序可以编译。
这样做的方法是在#if / #endif子句中定义您将使用的变量。如果没有子句匹配,那么变量将是未定义的,程序将无法编译。
通过变通方法可以在故障站点上引发错误。在#else子句中输入一个纯字符串,这将生成语法错误。使用@available
将生成编译器警告。
#if CONFIG1
let config = // Create config 1
#elseif CONFIG2
let config = // Create config 2
#else
// Compilation fails due to config variable undefined errors elsewhere in the program.
// Explicit syntax error to describe the scenario.
Config not specified.
// This generates a compiler warning.
@available(iOS, deprecated=1.0, message="Config not defined")
#endif
// Use config here, e.g.
let foo = config["fooSize"]
#error的主要思想是在缺少某些东西时导致编译错误,因为swift没有类似的预处理器语句,只是强制编译错误,就像这段代码一样。
#if CONFIG1
...
#elseif CONFIG2
...
#else
fatalError("CONFIG not defined")
callingANonExistingFunctionForBreakingTheCompilation()
#endif
请记住,C / C ++不会验证非匹配块的语法,但Swift会这样,所以这就是我调用函数而不仅仅是编写消息的原因。
另一种选择是使用你自己的标签来生成错误并在编译之前检查它,就像这个人做的那样here
好消息 - 如果您使用的是Swift 4.2或更新版本,您现在可以使用#error()
和#warning()
例如:
let someBoolean = true
#warning("implement real logic in the variable above") // this creates a yellow compiler warning
#error("do not pass go, do not collect $200") // this creates a red compiler error & prevents code from compiling
在这里查看已实施的提案https://github.com/apple/swift-evolution/blob/master/proposals/0196-diagnostic-directives.md