隐藏Swift"永远不会被执行"警告

时间:2016-02-04 19:47:53

标签: xcode swift clang compiler-warnings suppress-warnings

我有一些代码会产生如下警告:

  

代码路径 .swift:9:13:警告:永远不会被执行

       fatalError()
       ^
     

代码路径 .swift:9:13:注意:调用noreturn函数

       fatalError()
       ^

编译器输出没有提供任何-W个参数,我可以用来在源文件中将它们静音。我怎么能停止这些警告?

请注意这是测试代码,一切都按设计工作 - 删除所抱怨的行不是解决方案

1 个答案:

答案 0 :(得分:2)

Swift编译器没有抑制警告的选项 (我所知道的)。唯一的机会是避免警告。

在您的特定情况下,我没有完整的解释 警告,但可能的解决方法。正如你在评论中所说,

中的Nimble框架会出现问题
expect{ fatalError() }.to(throwError()) // Warning: Will never be executed

此处,{ fatalError() }() -> Void类型的闭包, 并expect最终调用Expression初始值设定项

public init(expression: () throws -> T?, location: SourceLocation, isClosure: Bool = true)

() throws -> T?类型的闭包作为第一个参数。 该问题现在与可选返回类型T?相关。

可以将其拆分为以下最小自包含示例

let cl1 : () -> Void  = { fatalError() } // No warning
let cl2 : () -> Void? = { fatalError() } // Warning: Will never be executed

只有第二行会生成警告。 我假设编译器创建了一些要转换的包装器代码 从VoidfatalError()的{​​{1}}返回类型,然后发出警告 包装器代码永远不会被执行。

作为一种解决方法,您可以将闭包类型显式为

Void?

或将闭包分配给中间变量:

let cl3 : () -> Void?  = { _ -> Void in fatalError() } // No warning

这适用于您的情况:

let fatalClosure = { fatalError() }
let cl4 : () -> Void? = fatalClosure // No warning

但请注意expect { _ -> Void in fatalError() }.to(throwError()) - 调用时 - 终止程序 立即。没有机会抓住"终止。