有没有办法让Swift编译器忽略错误?

时间:2018-03-18 15:37:38

标签: swift compiler-errors compilation

我想在编译Swift代码时忽略错误。例如,您正在编写一个尚未在您的应用程序中使用的类并且在其中存在错误,或者如果编译器只是对所有这些安全措施感到愚蠢,那么您是否可以编译它?你可以制作编译器编译它,即使它有点像hack-ish?

或者换句话说,如何将错误视为警告?

1 个答案:

答案 0 :(得分:3)

不,没有办法做到这一点。编译器错误是错误而不是警告原因:它们是源代码无法恢复的问题。

程序可能会有一些类别的错误,可能会或可能不会在编译器的不同级别捕获:

  1. 语法错误:这些是源代码中的错误,使其成为无效程序。由于代码本身无效,因此无法要求编译器继续编译程序超过语法错误。例如,你不能期望编译器将?123?5445?,asdf,34124:::::!22编译成Swift程序,因为它不是Swift代码。
  2. 语义错误:这些错误是您编写的代码有效的Swift,但在语义上可能没有意义。例如,func foo(_: String) {}; foo(5)存在语义错误:您将Int传递给期望String的函数。过去的语义验证,编译器需要决定为给定的表达式生成什么中间语言代码;它为foo(5)生成了什么代码?可以粉碎寄存器和堆栈状态以将任何值传递到任何地方,但这明确反对Swift所代表的一切。
    • 这里也有潜在的子类别。以上是类型不匹配错误;您在上面提到的super.init错误是对语言规则的强制执行(在将self传递给函数或在{上调用方法}之前,必须初始化所有实例变量 {1}})。
  3. 逻辑错误:这些错误通常无法被编译器捕获(逐个错误,错误的多线程代码等)。静态分析器可能在这里提供帮助,但这些通常是运行时错误。
  4. @JoshCaswell在注释中提到了上面未定义的行为 - Swift的一些语义是在尝试从语言中删除未定义的行为时强制执行的规则(如上面的初始化规则)。没有"不安全"模式,允许你关闭这些规则,以说Swift"我不关心这些规则的语义"因为他们是使Swift成为语言的代码。

    我无法想到 允许您继续编译过去的硬错误的任何编译器。即使C和C ++是未定义行为的堡垒,也不允许这样做,因为编译过去的错误会将未定义的行为引入编译器;一旦你尝试编码无效的AST,任何事情都可以。您可以获得自我不一致或无意义的程序。就像假设一个错误的陈述是真的允许你证明任何,如果你采用无效代码并允许它编译,就会产生任何数量的完全无意义的东西。