隐藏 Swift "Will never be executed" 警告

Hide Swift "Will never be executed" warning

我有一些代码会生成这样的警告:

code path.swift:9:13: warning: will never be executed

       fatalError()
       ^

code path.swift:9:13: note: a call to a noreturn function

       fatalError()
       ^

编译器输出没有提供任何 -W 参数,我可以使用这些参数在我的源文件中静音。我怎样才能停止这些警告?

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

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? 类型的闭包作为第一个参数。 现在的问题与 optional return 类型 T?.

有关

这可以简化为以下最小的独立示例

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

只有第二行会产生警告。 我假设编译器创建了一些包装代码来转换 Void return 类型从 fatalError()Void?,然后警告 永远不会执行包装器代码。

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

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

或者将闭包赋给一个中间变量:

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

这可以应用于您的案例:

expect {
    _ -> Void in fatalError()
}.to(throwError())

但请注意,fatalError()——调用时——终止程序 立即地。没有机会"catch"那个终止。