隐藏 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"那个终止。
我有一些代码会生成这样的警告:
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"那个终止。