抑制 Swift 编译器警告

Suppress Swift compiler warning

我在 Swift(Xcode 6.3 测试版)中使用 Nimble assertion framework 进行单元测试。它工作正常,但编译器对 Nimble 源代码中的一行发出警告:

public func expect<T>(expression: () -> T?, file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T> {
    return Expectation(
        expression: Expression(
            expression: expression,
            location: SourceLocation(file: file, line: line),
            isClosure: true))
}

第一行警告:

Closure parameter prior to parameters with default arguments will not be treated as a trailing closure

这不是一个非常严重的问题,但我希望在我的项目中将编译器警告的数量保持在较低水平(零)。有没有办法消除这个警告?

对于本主题的所有未来读者:当您有 尾随闭包 时,答案仅适用于这种情况。 AFAIK,你无法像在 Objective-C 中那样抑制 Swift 警告(禁用特定行的警告),也许当 Swift 编译器的源代码将开源时,会有一些有效的解决方案,这个答案会更新。在那之前,您可以检查这些答案(不是 Swift 具体):

In Xcode, how to suppress all warnings in specific source files?

Is there a way to suppress warnings in Xcode?

如果可以改变expect的签名,那么把参数表达式放在最后,如:

public func expect<T>(file: String = __FILE__, line: UInt = __LINE__, expression: () -> T?) -> Expectation<T>

老实说,将闭包参数作为第一个参数是一种糟糕的设计。

对我来说这似乎是一个非常严重的警告,您绝对应该忽略。看起来你认为是带闭包参数的函数调用,实际上是不带闭包参数的函数调用,后面跟着一个闭包。

通过将闭包放入参数列表,或者在调用之前将其分配给变量并传递该变量,您可以轻松避免警告并解决问题。

如果方法签名如下所示,您可以避免警告:

public func expect<T>(expression: (() -> T?), file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T> 

在第一个参数周围添加了额外的括号,使用 Swift 2.0 和 Xcode 7.1

进行了测试

另一种修复它的方法是在闭包属性之前让所有属性都具有默认值,因为尾随闭包是一个非常方便的事情

@Julian Król 的回答是错误的,原因有二:

  1. 代码片段展示了错误的语法,正确的是:

public func expect<T>(expression: (() -> T?), file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T>

  1. 即使在 Xcode 7.1 中使用正确的语法也无法解决问题,因为您无法使用尾随闭包调用此方法 - 它会给您编译错误,例如 Missing argument for parameter #1 in call.

使用提供的代码,您只会摆脱警告,但您将无法在调用此函数时使用尾随闭包。

它修复了警告,因为在 Swift 中,只有一个子变量的元组可以与单个变量互换。甚至 ((((value))))value 一样也是 the same。看起来编译器也无法将带有闭包子项的元组识别为函数参数列表中的独立闭包。