我在Swift(Xcode 6.3 beta)中使用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参数不会 被视为尾随封闭
这不是一个非常严重的问题,但我想在我的项目中保持编译器警告的数量很少(零)。有没有办法删除此警告?
答案 0 :(得分:25)
如果方法签名如下所示,您可以避免警告:
public func expect<T>(expression: (() -> T?), file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T>
在第一个参数周围添加了额外的括号,使用Swift 2.0和Xcode 7.1进行了测试
修复它的另一种方法是在闭包属性之前使用默认值的所有属性作为尾随闭包是一个非常方便的事情
答案 1 :(得分:3)
@JulianKról回答错误有两个原因:
public func expect<T>(expression: (() -> T?), file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T>
Missing argument for parameter #1 in call
的编译错误。使用提供的代码,您只会删除警告,但是当您调用此函数时,将无法使用尾随闭包。
它修复了警告,因为在Swift中,有一个孩子的元组可以与单个变量互换。即使((((value))))
the same也只是value
。同样看起来编译器无法识别带有闭包子元组的元组作为函数参数列表中的独立闭包。
答案 2 :(得分:-1)
对于本主题的所有未来读者:答案仅适用于尾随闭包的情况。 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>
老实说,将闭包参数作为第一个参数是不好的设计。
答案 3 :(得分:-2)
对我来说,这是一个非常严重的警告,你肯定应该不忽略。看来你认为带有闭包参数的函数调用实际上是一个没有闭包参数的函数调用,后跟一个闭包。
通过将闭包放入参数列表,或者在调用之前将其分配给变量并传递该变量,您可以轻松避免警告并解决问题。