我有一些代码会产生如下警告:
代码路径 .swift:9:13:警告:永远不会被执行
fatalError() ^
代码路径 .swift:9:13:注意:调用noreturn函数
fatalError() ^
编译器输出没有提供任何-W
个参数,我可以用来在源文件中将它们静音。我怎么能停止这些警告?
请注意这是测试代码,一切都按设计工作 - 删除所抱怨的行不是解决方案
答案 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
只有第二行会生成警告。
我假设编译器创建了一些要转换的包装器代码
从Void
到fatalError()
的{{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())
- 调用时 - 终止程序
立即。没有机会抓住"终止。