Swift中的#error(如何标记编译时错误)

问题描述 投票:7回答:3

什么是传统的c-style #error关键字的迅速替换?

当预定义失败时,我需要它来引发编译时错误:

#if CONFIG1
    ...
#elseif CONFIG2
    ...
#else
    #error "CONFIG not defined"
#endif
swift configuration compiler-errors predefined-macro
3个回答
3
投票

根据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"]

3
投票

#error的主要思想是在缺少某些东西时导致编译错误,因为swift没有类似的预处理器语句,只是强制编译错误,就像这段代码一样。

#if CONFIG1
...
#elseif CONFIG2
...
#else
    fatalError("CONFIG not defined")
    callingANonExistingFunctionForBreakingTheCompilation()
#endif

请记住,C / C ++不会验证非匹配块的语法,但Swift会这样,所以这就是我调用函数而不仅仅是编写消息的原因。

另一种选择是使用你自己的标签来生成错误并在编译之前检查它,就像这个人做的那样here


3
投票

好消息 - 如果您使用的是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

© www.soinside.com 2019 - 2024. All rights reserved.